This is the INM432 Big Data coursework 2024. This coursework contains extended elements of theory and practice, mainly around parallelisation of tasks withSpark and a bit about parallel training using TensorFlow.
Your tasks parallelization of tasks in PySpark, extension, evaluation, and theoretical reflection.
Please complete and submit the coding tasks in a copy of this notebook.
Write your code in the indicated cells and include the output in the submitted notebook.
Make sure that your code contains comments on its stucture and explanations of its purpose.
Provide also a report with the textual answers in a separate document.
Include screenshots from the Google Cloud web interface (don't use the SCREENSHOT function that Google provides, but take a picture of the graphs you see for the VMs) and result tables, as well as written text about the analysis.
Download and submit your version of this notebook as an .ipynb file and also submit a shareable link to your notebook on Colab in your report (created with the Colab 'Share' function) (and don’t change the online version after submission).
Further, provide your report as a PDF document. State the number of words in the document at the end. The report should not have more than 2000 words.
Please also submit a PDF of your Jupyter notebook.
This coursework focuses on parallelisation and scalability in the cloud with Spark and TesorFlow/Keras.
We start with code based on lessons 3 and 4 of the Fast and Lean Data Science course by Martin Gorner.
The course is based on Tensorflow for data processing and MachineLearning.
Tensorflow's data processing approach is somewhat similar to that of Spark, but you don't need to study Tensorflow, just make sure you understand the high-level structure.
What we will do here is parallelising pre-processing, and measuring performance, and we will perform evaluation and analysis on the cloud performance, as well as theoretical discussion.
This coursework contains 3 sections.
This section just contains some necessary code for setting up the environment. It has no tasks for you (but do read the code and comments).
Section 1 is about preprocessing a set of image files. We will work with a public dataset “Flowers” (3600 images, 5 classes). This is not a vast dataset, but it keeps the tasks more manageable for development and you can scale up later, if you like.
In 'Getting Started' we will work through the data preprocessing code from Fast and Lean Data Science which uses TensorFlow's tf.data package.
There is no task for you here, but you will need to re-use some of this code later.
In Task 1 you will parallelise the data preprocessing in Spark, using Google Cloud (GC) Dataproc. This involves adapting the code from 'Getting Started' to use Spark and running it in the cloud.
In Section 2 we are going to measure the speed of reading data in the cloud. In Task 2 we will paralellize the measuring of different configurations using Spark.
This section is about the theoretical discussion, based on one paper, in Task 3. The answers should be given in the PDF report.
For all coding tasks, take the time of the operations and for the cloud operations, get performance information from the web interfaces for your reporting and analysis.
The tasks are mostly independent of each other. The later tasks can mostly be addressed without needing the solution to the earlier ones.
As usual, you need to run the imports and authentication every time you work with this notebook. Use the local Spark installation for development before you send jobs to the cloud.
Read through this section once and fill in the project ID the first time, then you can just step straight throught this at the beginning of each session - except for the two authentication cells.
We import some packages that will be needed throughout. For the code that runs in the cloud, we will need separate import sections that will need to be partly different from the one below.
import os, sys, math
import numpy as np
import scipy as sp
import scipy.stats
import time
import datetime
import string
import random
from matplotlib import pyplot as plt
import tensorflow as tf
print("Tensorflow version " + tf.__version__)
import pickle
Tensorflow version 2.15.0
This is for authenticating with with GCS Google Drive, so that we can create and use our own buckets and access Dataproc and AI-Platform.
This section starts with the two interactive authentications.
First, we mount Google Drive for persistent local storage and create a directory DB-CW thay you can use for this work.
Then we'll set up the cloud environment, including a storage bucket.
print('Mounting google drive...')
from google.colab import drive
drive.mount('/content/drive')
%cd "/content/drive/MyDrive"
!mkdir BD-CW
%cd "/content/drive/MyDrive/BD-CW"
Mounting google drive... Mounted at /content/drive /content/drive/MyDrive mkdir: cannot create directory ‘BD-CW’: File exists /content/drive/MyDrive/BD-CW
Next, we authenticate with the GCS to enable access to Dataproc and AI-Platform.
import sys
if 'google.colab' in sys.modules:
from google.colab import auth
auth.authenticate_user()
It is useful to create a new Google Cloud project for this coursework. You can do this on the GC Console page by clicking on the entry at the top, right of the Google Cloud Platform and choosing New Project. Copy the generated project ID to the next cell. Also enable billing and the Compute, Storage and Dataproc APIs like we did during the labs.
We also specify the default project and region. The REGION should be us-central1 as that seems to be the only one that reliably works with the free credit.
This way we don't have to specify this information every time we access the cloud.
PROJECT = 'hale-ripsaw-421615' ### USE YOUR GOOGLE CLOUD PROJECT ID HERE. ###
!gcloud config set project $PROJECT
REGION = 'us-central1'
CLUSTER = '{}-cluster'.format(PROJECT)
!gcloud config set compute/region $REGION
!gcloud config set dataproc/region $REGION
!gcloud config list # show some information
Updated property [core/project].
WARNING: Property validation for compute/region was skipped.
Updated property [compute/region].
Updated property [dataproc/region].
[component_manager]
disable_update_check = True
[compute]
region = us-central1
[core]
account = marios641205@gmail.com
project = hale-ripsaw-421615
[dataproc]
region = us-central1
Your active configuration is: [default]
With the cell below, we create a storage bucket that we will use later for global storage. If the bucket exists you will see a "ServiceException: 409 ...", which does not cause any problems. You must create your own bucket to have write access.
BUCKET = 'gs://{}-storage'.format(PROJECT)
!gsutil mb $BUCKET
Creating gs://hale-ripsaw-421615-storage/... ServiceException: 409 A Cloud Storage bucket named 'hale-ripsaw-421615-storage' already exists. Try another name. Bucket names must be globally unique across all Google Cloud projects, including those outside of your organization.
The cell below just defines some routines for displaying images that will be used later. You can see the code by double-clicking, but you don't need to study this.
#@title Utility functions for image display **[RUN THIS TO ACTIVATE]** { display-mode: "form" }
def display_9_images_from_dataset(dataset):
plt.figure(figsize=(13,13))
subplot=331
for i, (image, label) in enumerate(dataset):
plt.subplot(subplot)
plt.axis('off')
plt.imshow(image.numpy().astype(np.uint8))
plt.title(str(label.numpy()), fontsize=16)
# plt.title(label.numpy().decode(), fontsize=16)
subplot += 1
if i==8:
break
plt.tight_layout()
plt.subplots_adjust(wspace=0.1, hspace=0.1)
plt.show()
def display_training_curves(training, validation, title, subplot):
if subplot%10==1: # set up the subplots on the first call
plt.subplots(figsize=(10,10), facecolor='#F0F0F0')
plt.tight_layout()
ax = plt.subplot(subplot)
ax.set_facecolor('#F8F8F8')
ax.plot(training)
ax.plot(validation)
ax.set_title('model '+ title)
ax.set_ylabel(title)
ax.set_xlabel('epoch')
ax.legend(['train', 'valid.'])
def dataset_to_numpy_util(dataset, N):
dataset = dataset.batch(N)
for images, labels in dataset:
numpy_images = images.numpy()
numpy_labels = labels.numpy()
break;
return numpy_images, numpy_labels
def title_from_label_and_target(label, correct_label):
correct = (label == correct_label)
return "{} [{}{}{}]".format(CLASSES[label], str(correct), ', shoud be ' if not correct else '',
CLASSES[correct_label] if not correct else ''), correct
def display_one_flower(image, title, subplot, red=False):
plt.subplot(subplot)
plt.axis('off')
plt.imshow(image)
plt.title(title, fontsize=16, color='red' if red else 'black')
return subplot+1
def display_9_images_with_predictions(images, predictions, labels):
subplot=331
plt.figure(figsize=(13,13))
classes = np.argmax(predictions, axis=-1)
for i, image in enumerate(images):
title, correct = title_from_label_and_target(classes[i], labels[i])
subplot = display_one_flower(image, title, subplot, not correct)
if i >= 8:
break;
plt.tight_layout()
plt.subplots_adjust(wspace=0.1, hspace=0.1)
plt.show()
You can use the cell below to install Spark locally on this Colab VM (like in the labs), to do quicker small-scale interactive testing. Using Spark in the cloud with Dataproc is still required for the final version.
%cd
!apt-get update -qq
!apt-get install openjdk-8-jdk-headless -qq >> /dev/null # send any output to null device
!tar -xzf "/content/drive/My Drive/Big_Data/data/spark/spark-3.5.0-bin-hadoop3.tgz" # unpack
!pip install -q findspark
import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/root/spark-3.5.0-bin-hadoop3"
import findspark
findspark.init()
import pyspark
print(pyspark.__version__)
sc = pyspark.SparkContext.getOrCreate()
print(sc)
/root 3.5.0
/usr/lib/python3.10/subprocess.py:1796: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock. self.pid = _posixsubprocess.fork_exec(
<SparkContext master=local[*] appName=pyspark-shell>
This section is about the pre-processing of a dataset for deep learning. We first look at a ready-made solution using Tensorflow and then we build a implement the same process with Spark. The tasks are about parallelisation and analysis the performance of the cloud implementations.
In this section, we get started with the data pre-processing. The code is based on lecture 3 of the 'Fast and Lean Data Science' course.
This code is using the TensorFlow tf.data package, which supports map functions, similar to Spark. Your task will be to re-implement the same approach in Spark.
We start by setting some variables for the Flowers dataset.
GCS_PATTERN = 'gs://flowers-public/*/*.jpg' # glob pattern for input files
PARTITIONS = 16 # no of partitions we will use later
TARGET_SIZE = [192, 192] # target resolution for the images
CLASSES = [b'daisy', b'dandelion', b'roses', b'sunflowers', b'tulips']
# labels for the data
We read the image files from the public GCS bucket that contains the Flowers dataset. TensorFlow has functions to execute glob patterns that we use to calculate the the number of images in total and per partition (rounded up as we cannont deal with parts of images).
nb_images = len(tf.io.gfile.glob(GCS_PATTERN)) # number of images
partition_size = math.ceil(1.0 * nb_images / PARTITIONS) # images per partition (float)
print("GCS_PATTERN matches {} images, to be divided into {} partitions with up to {} images each.".format(nb_images, PARTITIONS, partition_size))
GCS_PATTERN matches 3670 images, to be divided into 16 partitions with up to 230 images each.
In order to read use the images for learning, they need to be preprocessed (decoded, resized, cropped, and potentially recompressed). Below are map functions for these steps. You don't need to study the internals of these functions in detail.
def decode_jpeg_and_label(filepath):
# extracts the image data and creates a class label, based on the filepath
bits = tf.io.read_file(filepath)
image = tf.image.decode_jpeg(bits)
# parse flower name from containing directory
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
label2 = label.values[-2]
return image, label2
def resize_and_crop_image(image, label):
# Resizes and cropd using "fill" algorithm:
# always make sure the resulting image is cut out from the source image
# so that it fills the TARGET_SIZE entirely with no black bars
# and a preserved aspect ratio.
w = tf.shape(image)[0]
h = tf.shape(image)[1]
tw = TARGET_SIZE[1]
th = TARGET_SIZE[0]
resize_crit = (w * th) / (h * tw)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [w*tw/w, h*tw/w]), # if true
lambda: tf.image.resize(image, [w*th/h, h*th/h]) # if false
)
nw = tf.shape(image)[0]
nh = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (nw - tw) // 2, (nh - th) // 2, tw, th)
return image, label
def recompress_image(image, label):
# this reduces the amount of data, but takes some time
image = tf.cast(image, tf.uint8)
image = tf.image.encode_jpeg(image, optimize_size=True, chroma_downsampling=False)
return image, label
With tf.data, we can apply decoding and resizing as map functions.
dsetFiles = tf.data.Dataset.list_files(GCS_PATTERN) # This also shuffles the images
dsetDecoded = dsetFiles.map(decode_jpeg_and_label)
dsetResized = dsetDecoded.map(resize_and_crop_image)
We can also look at some images using the image display function defined above (the one with the hidden code).
display_9_images_from_dataset(dsetResized)
Now, let's test continuous reading from the dataset. We can see that reading the first 100 files already takes some time.
sample_set = dsetResized.batch(10).take(10) # take 10 batches of 10 images for testing
for image, label in sample_set:
print("Image batch shape {}, {})".format(image.numpy().shape,
[lbl.decode('utf8') for lbl in label.numpy()]))
Image batch shape (10, 192, 192, 3), ['dandelion', 'dandelion', 'tulips', 'dandelion', 'dandelion', 'roses', 'roses', 'roses', 'tulips', 'dandelion']) Image batch shape (10, 192, 192, 3), ['roses', 'sunflowers', 'daisy', 'daisy', 'dandelion', 'daisy', 'dandelion', 'tulips', 'daisy', 'dandelion']) Image batch shape (10, 192, 192, 3), ['dandelion', 'dandelion', 'dandelion', 'dandelion', 'daisy', 'roses', 'sunflowers', 'roses', 'daisy', 'sunflowers']) Image batch shape (10, 192, 192, 3), ['roses', 'tulips', 'sunflowers', 'daisy', 'roses', 'roses', 'daisy', 'tulips', 'sunflowers', 'sunflowers']) Image batch shape (10, 192, 192, 3), ['sunflowers', 'daisy', 'tulips', 'tulips', 'roses', 'dandelion', 'daisy', 'dandelion', 'roses', 'roses']) Image batch shape (10, 192, 192, 3), ['roses', 'tulips', 'daisy', 'roses', 'sunflowers', 'daisy', 'tulips', 'roses', 'roses', 'daisy']) Image batch shape (10, 192, 192, 3), ['dandelion', 'tulips', 'tulips', 'roses', 'roses', 'roses', 'roses', 'sunflowers', 'tulips', 'sunflowers']) Image batch shape (10, 192, 192, 3), ['roses', 'dandelion', 'roses', 'tulips', 'daisy', 'sunflowers', 'dandelion', 'daisy', 'sunflowers', 'dandelion']) Image batch shape (10, 192, 192, 3), ['dandelion', 'dandelion', 'dandelion', 'roses', 'roses', 'daisy', 'daisy', 'roses', 'sunflowers', 'daisy']) Image batch shape (10, 192, 192, 3), ['sunflowers', 'daisy', 'roses', 'dandelion', 'roses', 'dandelion', 'tulips', 'daisy', 'dandelion', 'dandelion'])
Using individual image files didn't look very fast. The 'Lean and Fast Data Science' course introduced two techniques to improve the speed.
By compressing the images in the reduced resolution we save on the size. This costs some CPU time upfront, but saves network and disk bandwith, especially when the data are read multiple times.
# This is a quick test to get an idea how long recompressions takes.
dataset4 = dsetResized.map(recompress_image)
test_set = dataset4.batch(10).take(10)
for image, label in test_set:
print("Image batch shape {}, {})".format(image.numpy().shape, [lbl.decode('utf8') for lbl in label.numpy()]))
Image batch shape (10,), ['dandelion', 'roses', 'daisy', 'roses', 'sunflowers', 'roses', 'tulips', 'sunflowers', 'dandelion', 'dandelion']) Image batch shape (10,), ['sunflowers', 'roses', 'roses', 'dandelion', 'roses', 'sunflowers', 'tulips', 'tulips', 'dandelion', 'tulips']) Image batch shape (10,), ['dandelion', 'daisy', 'tulips', 'roses', 'dandelion', 'tulips', 'dandelion', 'daisy', 'sunflowers', 'dandelion']) Image batch shape (10,), ['tulips', 'roses', 'daisy', 'daisy', 'daisy', 'tulips', 'tulips', 'roses', 'tulips', 'sunflowers']) Image batch shape (10,), ['tulips', 'tulips', 'tulips', 'tulips', 'daisy', 'daisy', 'dandelion', 'roses', 'tulips', 'sunflowers']) Image batch shape (10,), ['roses', 'tulips', 'roses', 'daisy', 'dandelion', 'sunflowers', 'tulips', 'tulips', 'daisy', 'sunflowers']) Image batch shape (10,), ['dandelion', 'roses', 'sunflowers', 'sunflowers', 'roses', 'sunflowers', 'roses', 'daisy', 'roses', 'roses']) Image batch shape (10,), ['daisy', 'dandelion', 'sunflowers', 'sunflowers', 'daisy', 'sunflowers', 'sunflowers', 'daisy', 'tulips', 'roses']) Image batch shape (10,), ['sunflowers', 'dandelion', 'roses', 'sunflowers', 'dandelion', 'daisy', 'daisy', 'tulips', 'dandelion', 'tulips']) Image batch shape (10,), ['roses', 'dandelion', 'roses', 'roses', 'dandelion', 'tulips', 'roses', 'roses', 'dandelion', 'sunflowers'])
By writing multiple preprocessed samples into a single file, we can make further speed gains. We distribute the data over partitions to facilitate parallelisation when the data are used. First we need to define a location where we want to put the file.
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers' # prefix for output file names
Now we can write the TFRecord files to the bucket.
Running the cell takes some time and only needs to be done once or not at all, as you can use the publicly available data for the next few cells. For convenience I have commented out the call to write_tfrecords at the end of the next cell. You don't need to run it (it takes some time), but you'll need to use the code below later (but there is no need to study it in detail).
There is a ready-made pre-processed data versions available here:
gs://flowers-public/tfrecords-jpeg-192x192-2/, that we can use for testing.
# functions for writing TFRecord entries
# Feature values are always stored as lists, a single data element will be a list of size 1
def _bytestring_feature(list_of_bytestrings):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))
def _int_feature(list_of_ints): # int64
return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))
def to_tfrecord(tfrec_filewriter, img_bytes, label): # Create tf data records
class_num = np.argmax(np.array(CLASSES)==label) # 'roses' => 2 (order defined in CLASSES)
one_hot_class = np.eye(len(CLASSES))[class_num] # [0, 0, 1, 0, 0] for class #2, roses
feature = {
"image": _bytestring_feature([img_bytes]), # one image in the list
"class": _int_feature([class_num]) #, # one class in the list
}
return tf.train.Example(features=tf.train.Features(feature=feature))
def write_tfrecords(GCS_PATTERN,GCS_OUTPUT,partition_size): # write the images to files.
print("Writing TFRecords")
tt0 = time.time()
filenames = tf.data.Dataset.list_files(GCS_PATTERN)
dataset1 = filenames.map(decode_jpeg_and_label)
dataset2 = dataset1.map(resize_and_crop_image)
dataset3 = dataset2.map(recompress_image)
dataset4 = dataset3.batch(partition_size) # partitioning: there will be one "batch" of images per file
for partition, (image, label) in enumerate(dataset4):
# batch size used as partition size here
partition_size = image.numpy().shape[0]
# good practice to have the number of records in the filename
filename = GCS_OUTPUT + "{:02d}-{}.tfrec".format(partition, partition_size)
# You need to change GCS_OUTPUT to your own bucket to actually create new files
with tf.io.TFRecordWriter(filename) as out_file:
for i in range(partition_size):
example = to_tfrecord(out_file,
image.numpy()[i], # re-compressed image: already a byte string
label.numpy()[i] #
)
out_file.write(example.SerializeToString())
print("Wrote file {} containing {} records".format(filename, partition_size))
print("Total time: "+str(time.time()-tt0))
#write_tfrecords(GCS_PATTERN,GCS_OUTPUT,partition_size) # uncomment to run this cell
We can now read from the TFRecord files. By default, we use the files in the public bucket. Comment out the 1st line of the cell below to use the files written in the cell above.
GCS_OUTPUT = 'gs://flowers-public/tfrecords-jpeg-192x192-2/'
#remove the line above to use your own files that you generated above
def read_tfrecord(example):
features = {
"image": tf.io.FixedLenFeature([], tf.string), # tf.string = bytestring (not text string)
"class": tf.io.FixedLenFeature([], tf.int64) #, # shape [] means scalar
}
# decode the TFRecord
example = tf.io.parse_single_example(example, features)
image = tf.image.decode_jpeg(example['image'], channels=3)
image = tf.reshape(image, [*TARGET_SIZE, 3])
class_num = example['class']
return image, class_num
def load_dataset(filenames):
# read from TFRecords. For optimal performance, read from multiple
# TFRecord files at once and set the option experimental_deterministic = False
# to allow order-altering optimizations.
option_no_order = tf.data.Options()
option_no_order.experimental_deterministic = False
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.with_options(option_no_order)
dataset = dataset.map(read_tfrecord)
return dataset
filenames = tf.io.gfile.glob(GCS_OUTPUT + "*.tfrec")
datasetTfrec = load_dataset(filenames)
Let's have a look if reading from the TFRecord files is quicker.
batched_dataset = datasetTfrec.batch(10)
sample_set = batched_dataset.take(10)
for image, label in sample_set:
print("Image batch shape {}, {})".format(image.numpy().shape, \
[str(lbl) for lbl in label.numpy()]))
Image batch shape (10, 192, 192, 3), ['1', '3', '3', '1', '1', '2', '4', '3', '4', '3']) Image batch shape (10, 192, 192, 3), ['3', '0', '3', '4', '2', '2', '3', '2', '0', '3']) Image batch shape (10, 192, 192, 3), ['4', '4', '4', '1', '3', '2', '4', '4', '4', '3']) Image batch shape (10, 192, 192, 3), ['1', '3', '4', '1', '1', '4', '2', '2', '3', '2']) Image batch shape (10, 192, 192, 3), ['0', '4', '3', '4', '0', '1', '2', '1', '2', '0']) Image batch shape (10, 192, 192, 3), ['1', '1', '1', '2', '0', '0', '1', '4', '3', '1']) Image batch shape (10, 192, 192, 3), ['1', '2', '0', '2', '3', '4', '2', '1', '1', '0']) Image batch shape (10, 192, 192, 3), ['0', '1', '1', '3', '1', '0', '1', '3', '3', '3']) Image batch shape (10, 192, 192, 3), ['3', '3', '3', '1', '1', '2', '0', '3', '0', '1']) Image batch shape (10, 192, 192, 3), ['0', '0', '1', '1', '1', '0', '1', '4', '3', '2'])
Wow, we have a massive speed-up! The repackageing is worthwhile :-)
Since recompressing and repackaging is very effective, we would like to be able to do it inparallel for large datasets. This is a relatively straightforward case of parallelisation. We will use Spark to implement the same process as above, but in parallel.
Re-implement the pre-processing in Spark, using Spark mechanisms for distributing the workload over multiple machines.
You need to:
i) Copy over the mapping functions (see section 1.1) and adapt the resizing and recompression functions to Spark (only one argument). (3%)
ii) Replace the TensorFlow Dataset objects with RDDs, starting with an RDD that contains the list of image filenames. (3%)
iii) Sample the the RDD to a smaller number at an appropriate position in the code. Specify a sampling factor of 0.02 for short tests. (1%)
iv) Then use the functions from above to write the TFRecord files. (3%)
v) The code for writing to the TFRecord files needs to be put into a function, that can be applied to every partition with the 'RDD.mapPartitionsWithIndex' function. The return value of that function is not used here, but you should return the filename, so that you have a list of the created TFRecord files. (4%)
### CODING TASK ###
#i) Copy over the mapping functions (see section 1.1) and adapt the resizing and recompression functions to Spark (only one argument). (3%)
import os, sys, math
import numpy as np
import scipy as sp
import scipy.stats
import time
import string
import datetime
import random
from matplotlib import pyplot as plt
import tensorflow as tf
print("Tensorflow version " + tf.__version__)
import pickle
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
PROJECT = 'hale-ripsaw-421615'
BUCKET = 'gs://{}-storage'.format(PROJECT)
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
PARTITIONS = 16
def decode_jpeg_and_label(filepath):
bits = tf.io.read_file(filepath)
image = tf.image.decode_jpeg(bits)
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
label2 = label.values[-2]
return image, label2
def resize_and_crop_image(dataset):
image, label = dataset
w = tf.shape(image)[0]
h = tf.shape(image)[1]
tw = TARGET_SIZE[1]
th = TARGET_SIZE[0]
resize_crit = (w * th) / (h * tw)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [w*tw/w, h*tw/w]),
lambda: tf.image.resize(image, [w*th/h, h*th/h])
)
nw = tf.shape(image)[0]
nh = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (nw - tw) // 2, (nh - th) // 2, tw, th)
return (image, label)
def recompress_image(dataset):
image, label = dataset
image = tf.cast(image, tf.uint8)
image = tf.image.encode_jpeg(image, optimize_size=True, chroma_downsampling=False)
return (image, label)
#in the above code we are importing the necessary libraries
#we define paths and project constants for accessing and storing data
#we read an image from a file path, decode it from JPEG and extract its labels from the file path
#we resize the image to the target size and recompress it to a jpeg format
Tensorflow version 2.15.0
#ii) Replace the TensorFlow Dataset objects with RDDs, starting with an RDD that contains the list of image filenames. (3%)
from pyspark.sql import SparkSession
sc = pyspark.SparkContext.getOrCreate()
spark = SparkSession.builder.getOrCreate()
filesnames = tf.io.gfile.glob(GCS_PATTERN)
rddimages = sc.parallelize(filesnames)
#we initialize spark contenxt and sessions which are essential when working with rdds
#we use tensorflow file manipulation functions to list image files and create an rdd (rdd images)
#iii) Sample the the RDD to a smaller number at an appropriate position in the code. Specify a sampling factor of 0.02 for short tests. (1%)
rdd1_sample = rddimages.sample(False, 0.02)
rdd2_decode_jpeg_and_label = rddimages.map(decode_jpeg_and_label)
rdd3_resize_and_crop_image = rdd2_decode_jpeg_and_label.map(resize_and_crop_image)
rdd4_recompress_image = rdd3_resize_and_crop_image.map(recompress_image)
#we reduce the dataset size by randomly sampling 2% of the data which is useful for quicktesting
#we use map functions so each image file path in the rdd is procesed through the mentioned transformations
#the transformations are applied sequentially using the .map function
#iv) Then use the functions from above to write the TFRecord files. (3%)
def _bytestring_feature(list_of_bytestrings):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))
def _int_feature(list_of_ints):
return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))
def to_tfrecord(tfrec_filewriter, img_bytes, label):
class_num = np.argmax(np.array(CLASSES)==label)
one_hot_class = np.eye(len(CLASSES))[class_num]
feature = {
"image": _bytestring_feature([img_bytes]),
"class": _int_feature([class_num]) ,
}
return tf.train.Example(features=tf.train.Features(feature=feature))
print("Writing TFRecords")
def write_tfrecords(partition_index,partition):
filename = GCS_OUTPUT + "{}.tfrec".format(partition_index)
with tf.io.TFRecordWriter(filename) as out_file:
for element in partition:
image=element[0]
label=element[1]
example = to_tfrecord(out_file,
image.numpy(),
label.numpy()
)
out_file.write(example.SerializeToString())
return [filename]
#we define helper functions to create specific types of tensorflow features
#which are bytestring feature and intfeature
#we construct and write the processed image data into tfrecord files
#which are efficient binary files used by tensorflow when training models
Writing TFRecords
#v) The code for writing to the TFRecord files needs to be put into a function, that can be applied to every partition with the 'RDD.mapPartitionsWithIndex' function. The return value of that function is not used here, but you should return the filename, so that you have a list of the created TFRecord files. (4%)
rdd5_partitions = rdd4_recompress_image.repartition(PARTITIONS)
rdd1_filenames = rdd4_recompress_image.mapPartitionsWithIndex(write_tfrecords)
#we adjust the number of partitions in the rdd to optimize for parallel processing
rdd1_filenames.take(1)
#we retrieve the first rdd filename
['gs://hale-ripsaw-421615-storage/tfrecords-jpeg-192x192-2/flowers0.tfrec']
rdd2_decode_jpeg_and_label.take(1)
#we retrieve a tuple from the rdd
[(<tf.Tensor: shape=(263, 320, 3), dtype=uint8, numpy=
array([[[133, 135, 132],
[136, 138, 135],
[140, 142, 139],
...,
[152, 152, 150],
[155, 155, 153],
[148, 148, 146]],
[[133, 135, 132],
[136, 138, 135],
[140, 142, 139],
...,
[153, 153, 151],
[155, 155, 153],
[147, 147, 145]],
[[132, 134, 129],
[135, 137, 134],
[139, 141, 138],
...,
[152, 152, 150],
[154, 154, 152],
[146, 146, 144]],
...,
[[ 44, 48, 25],
[ 44, 48, 25],
[ 44, 48, 25],
...,
[127, 126, 122],
[127, 126, 122],
[127, 126, 122]],
[[ 44, 48, 25],
[ 44, 48, 25],
[ 44, 48, 25],
...,
[128, 127, 123],
[128, 127, 123],
[128, 127, 123]],
[[ 43, 47, 24],
[ 43, 47, 24],
[ 43, 47, 24],
...,
[129, 128, 124],
[129, 128, 124],
[130, 129, 125]]], dtype=uint8)>,
<tf.Tensor: shape=(), dtype=string, numpy=b'daisy'>)]
rdd3_resize_and_crop_image.take(1)
#we retrieve a tuple from the rdd
[(<tf.Tensor: shape=(192, 192, 3), dtype=float32, numpy=
array([[[154.31648 , 158.31648 , 161.31648 ],
[154.03465 , 158.03465 , 161.03465 ],
[152.40732 , 156.40732 , 159.40732 ],
...,
[166.26291 , 167.93884 , 169.71353 ],
[164.40128 , 168.40128 , 169.40128 ],
[164. , 168. , 169. ]],
[[168.3533 , 172.16167 , 175.54494 ],
[166.39734 , 170.39734 , 173.39734 ],
[163.65054 , 167.65054 , 170.65054 ],
...,
[165.4297 , 167.10564 , 168.88033 ],
[164.40128 , 168.40128 , 169.40128 ],
[164. , 168. , 169. ]],
[[164.95058 , 168. , 172.90114 ],
[163.81895 , 167.81895 , 170.81895 ],
[162.34184 , 166.34184 , 169.34184 ],
...,
[166.90747 , 167.95851 , 169.9415 ],
[166.25023 , 167.47679 , 169.40128 ],
[165.84895 , 167.07552 , 169. ]],
...,
[[120.384514, 118.384514, 119.384514],
[123.10339 , 121.159195, 122.131294],
[124.0755 , 124.0755 , 124.878075],
...,
[127.89167 , 127.34229 , 124.66636 ],
[126.44648 , 127.44648 , 122.44648 ],
[126.97421 , 127.97421 , 122.97421 ]],
[[121.46287 , 119.46287 , 120.46287 ],
[124.460785, 122.51658 , 123.48868 ],
[124.8213 , 124.8213 , 125.62388 ],
...,
[129.9137 , 129.46465 , 126.78871 ],
[126.821304, 128. , 123. ],
[127. , 128. , 123. ]],
[[122.18799 , 120.18799 , 121.18799 ],
[124.977264, 123.03305 , 124.00516 ],
[123.783615, 123.783615, 124.5862 ],
...,
[131.46323 , 131.13916 , 128.46323 ],
[126.925804, 128.8151 , 123.815094],
[127. , 128.02274 , 123.022736]]], dtype=float32)>,
<tf.Tensor: shape=(), dtype=string, numpy=b'daisy'>)]
rdd4_recompress_image.take(1)
#we retrieve a tuple from the rdd
[(<tf.Tensor: shape=(), dtype=string, numpy=b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x01,\x01,\x00\x00\xff\xdb\x00C\x00\x02\x01\x01\x01\x01\x01\x02\x01\x01\x01\x02\x02\x02\x02\x02\x04\x03\x02\x02\x02\x02\x05\x04\x04\x03\x04\x06\x05\x06\x06\x06\x05\x06\x06\x06\x07\t\x08\x06\x07\t\x07\x06\x06\x08\x0b\x08\t\n\n\n\n\n\x06\x08\x0b\x0c\x0b\n\x0c\t\n\n\n\xff\xdb\x00C\x01\x02\x02\x02\x02\x02\x02\x05\x03\x03\x05\n\x07\x06\x07\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\xff\xc0\x00\x11\x08\x00\xc0\x00\xc0\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1c\x00\x00\x03\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\x05\x06\x07\x03\x02\x01\x08\x00\xff\xc4\x00D\x10\x00\x02\x01\x03\x03\x03\x02\x03\x04\x08\x03\x06\x05\x05\x01\x00\x01\x02\x03\x04\x05\x11\x00\x06\x12\x07!1\x13A"Qa\x142q\x81\x08\x15#BRb\x91\xa1\x16\xb1\xc1\x173r\x82\xd1\xe1CS\x92\xb2\xf0\t$4c\xc2\xf1\xff\xc4\x00\x1c\x01\x00\x02\x03\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x04\x01\x02\x05\x00\x06\x07\x08\xff\xc4\x008\x11\x00\x01\x04\x01\x03\x03\x02\x04\x05\x04\x01\x02\x07\x00\x00\x00\x01\x00\x02\x03\x11!\x04\x121\x05AQ\x13"\x062aq\x14\x81\x91\xa1\xc1B\xb1\xd1\xf0b#R\x07\x163\x92\xc2\xe1\xf1\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xfd5\xbc:l\xbfg\xfbK[)\xaa\xa3\x1d\xfb@;\x8f\xe9\x91\xf9cM9\x96)\x00r\xa2+6F\xd9e+\x1d\x03\xd1\xb6\x7fq\xb9(\xef\xf2n\xff\x00\xdf@14\x8a!\x10 c\xda\x97\xad\xb1X\x97\x8bd)_N\xa0\xf3Z`y\x05>A_?\xe6>\xba\x10\x89\xd1\xba\xc2\x92A]\xb7\x15\x8e\x92\xedo[\xb5\xa2Q,N2\x08\x1d\xd4\xfc\x8f\xd4j\xb2g*\x1b\x81I\r\n\xb2\x1cH0\xf1v`}\xd7\xe7\xf9h\x1b\x88WZ\xf6\xd5\xa7\x82\xfb\xb7b\xad\xa3\x94Hx\x85\x99\x07\x98\xdb\xe4~Z\xd2\x89\xe1\xcdAp+\x95u\x9d\xf2c#\xe2C\xd8\x11\xe7R\xf5!\xd4)z\xa5\x84\x04\xf4\xe5\\\x0c`\x9flh@\xf6R\x99\xd8\x0bS\xc8\xf6\xe7\x97*FT\x9f\x18\xd5\xb7R\xa9\x04\x94-\xf6\x98\xc1Pb\x0b\x8eC\xf7|gJ=\xd96\xac\x17]\xb9C\xf6\xa8\x1aR0Q\xc0\xe4?\xb6\x8d\x05l*\x1c/(\xeb\x9d9\x92"Ja\x91\xbb\xfduw\xb8\xaaU)\xc9\xe3\rP"9\xc6y\x03\xee>\x9aQ\xce\xf7"\x80i.\xdd5\xeb%\x17\xd9\xd8\x10\xe8p\x0e\xa0\xba\xd4\x81If\xd2\xa252\x19\xd8\x9c!gbuM\xdbl\xab-Kc\x07Khi{r\\\xfe\'N@\x08\x88!\xbb(m\xedsx\xa2g\x07\xca\x80\x07\xd7R\xf7P\xc2\x86\x82\xb2\x1b\xbc\x8a\xd5/\x17\x12\xceX\xfa\x87K;!\x15\tg\x85\xea*\x16*\x18\x81%\xb0X\x8f:\xb3\x0eT\x1e\x15\xc5\xaa\x86+u\'\xa2\x1b\x94\x84|o\x9f\x1ap\r\xa1U\xa36\xbe\xd6T\xfai\x85\xc1\x1f#\xaa\xda\xba\xf1K5B\xfcl\xc0)=\xb8\xe8E\xc6\xd4\x11i\x84W\x04\\\x12\x17\x97\xb0\xd5\xc3\x85*"c\x96i\xc6do\x1e\x01\xed\x8dM\x85\xd5j\x86\xcd\xbc\xe8\xae\xf1\x08j\xc0\x89\xc8\xfb\xcd\xddO\xd0\xfc\xb4\xc0p*\xa5\xa4!w\x1e\xd1\xa4\xb8#IO\x18\x8aO\x97\x81\xab\x96\x82\x17\x02F\x14\x15\xd2\x9a\xe5a\x9c\xb2\x93\x1b\xc6{\xe7\xb1\xc6\x82AW\x02\xd2\xe9\xf7\x0cQ\xcc\xf3\xc9N\x8a\xd2\x91\xf6\x92\x8b\x81\'\xd5\x87\x82~\xbe~\xba\x03\xfc\xab\x01E\x05s\xb7AT?X\xdb@\xc7\xef\x01\xfd\xf4\x8c\xa0\xf6R\xbcm\xbd\xd1u\xda\x97\x11]l\x9c\xa9=\x99s\xf0\xba\xff\x00\t\xf9\xfb\xe8qN\xe6\x11\x95\x05k\x9bn\xefg\xdf\xb6\xaf\xd6T\n\x12d\xedQ\x01\xc6S\xea5\xac\xc9\x04\xad\xb1\xca\x13\x81\x0b\xec\xb6\x89)*\x03\x18\xb2\x87\xce|\x11\xa1\xbb\xd8mH6\xbd\x1bi\x86e\x9a\x01\xd9{\x9f\xc0\xe8\x01\xe2\xd4\xa1\xee\xc0M nJq\xd8\x8d\nRM\x95\x00R\'f*Esk{7\xc3P\x84\x00|\x07\x1d\xc7\xfa\x8f\xcfQ\xa5\x97k\xe8\xa9Ln\xb4,\xa9\x95\x18*pA\xf9i\x99\r\x1bU\xabR\xd7H1;\x11\xd8\x81\xd8\x8d(\xe22\xe4e%\xb8\xd8\xd4\xd4\x10s\x9c\xff\x00}T>\xd7&\x14\xb0\xfe\xa8\xdbe\xc9\xc3\xc80@\x1d\xf0N\xa9;\xa8\x86\xaeW\xf6\xc7Z\x1a\x14\x90\x90\xa1\x17\xce<\x7f\xf3\x1a\xd4s\x83@CQ\xddD\xbe4\xce!\x82L)\x07:^G\xf8Vj\xcf\xeb\rD\xd5\x1cQ\xb8\xa1\x19$\xfb\xe8\\\xab&\xb6\x1a\x8a\x1b]u5\xbc\xb05u\x9c\xfe\xcb\x02\x81\xc9\x91\x00\xf5\x1f\x1ex\x82\xca\t\xc7\x97A\xe5\x80\xd3\x11`*\xbb\x85O\x91K\x1a\x86S\xf1.A#\xce\x8a\xe7\xd0\\\xde\x10RG-@w\x990\xa0\xfe\x1a\x1e\xf5e\xcaA \x94,hr\x17\xe1\\\xe8w}\xd7&\x14\x14\xce"\x12N\x01o\x90\xd1ZqJ\x08\xb2\x98\xc6\xe8\xa7\xb0\xfcs\xa30P\\\x05(\x8b}\xd6\xb2\xdd\xc6XKI\t\xf1\x83\xdck\x81\xa54\xad6\x9e\xff\x00\x8eH\xd6\xddr\x98\xe0vI\x1b\xbe;\xe8\xad}\xa1\x90\x99_h\xa2\xb9\xc0V\\:\xb0\xf8X\x0c\x91\xf8\x1dK\x95Au\xac\xc7wY\xaa-s\xb3p\xcac\xb1S\xdb\x1aZAH\xa1!\xa2\xdckAX)%\x9f\xd1Wo\x86F\x19U?\xcd\xf3_\x9f\xd3\xbf\xb6\x96~M.<#\xea\xd2*\xd4z\x88#(c8\x9a\x12Fco\x97\xd4\x1f \xfc\xb5\x9c\xf1\xb4\xa9D\xec\xdd\xe5_\xb2o\xf1\xdc\xe92T\x10\'\x84\xf8u\xf7\xfc\xfeZ\x985\x067\xd8\xe1q\x00\x85\xb8\xcd\xbb\xf6\xadU\xba\x0b\xb55j4UQ+\xac`d\xaeGp~Z\xd7s\xc3\xdb\xf4B\r\xa4\x82\xbb\xa86jW+O\x1b\xc8A\xed\x98\x81\x18\xfc\xce\x80Z{\x14@\x02\xf1\xfe\xd1\xecu\xc3\x15\xb6\xe0\xb8\x03\x05\xa0Q\xfeCB>\xafb\xba\x826\x82\xe5o\x9f\x15v\xc5G*\xc1\x82\xaf\xc2r<`\x8e\xd9\xfcF\xa9\xb9\xa1\xde\xe0\xb8\x8bO\x16\xfdl\xbe\xc6\xefLJJ\x8b\x89`\x93\xef\x021\xfdt\xcb\xddm\x07\xb2\xa0\x05M_\x93\xf6\xce\xe8\x07\x8f\x1a\xcd{\xad\xc5\x11MU[\xe3\xa8\xabW\xf1\x9e\xec51;\xdd~\x17.\x1b\x86\xb1RJj5\xce\x1ed^\xff\x00V\x1a]\xcf\xdf0\xfb\xaeVw*\xf1\x1d\x03A!\n\xae\xbd\xbf\xeb\xfd\xf5\xae\xf7Z\xa6B\xcew\x05\xc9j\xd5\x84J~\x169\'K\xbd\xe3n\x15\x85\xa51\xa27+\x85\xc6\xa5)\xe9\xe0\x8d\x9eY\xe5p\xaa\x88\xa3,\xccO`\x00\x19\xc9\xd7F\xe79\xdfE%\x13\xd1\xfaz\xcd\xca*z\x97u\xa6\xf4\xd2\xf2\xa8\xb6zFB\x1a\x9e\xdc\x99\xf4Cg\xc3I\xc8\xcc\xcb\xfb\xbc\xd1\x0eLy\xd3\xd1\xd5*e^TS4\x90<\x92F\xcc\x07`W\xb9\xc9\xec\x064\xbe\xa6M\x80\xbb\xc2\xbbE\xa1\xae\x14\x92A\xc66h\xc7\x15\xc7\x10|\x9dQ\x8f%\x80\x95\xc88\xe1XY\xa4\x90\x8c\x8e\xc7\x1f\xe5\xa2\x85\xc8\x98\xb8\x14R\x1f\x05[-\x83\xfd\xb4f.A\xde\xef\xd1\xc0\x1a\x9a\x9c\x8e\xfd\xd9\xbd\xb4n\xd8\\\x92\x8bl\xf4\xbd\xc2\xfe\xf6Y\x08\xf6\xd5\xa8\xa8\xdc\x17\x89)Lg\xed\x14|\xc8\xcf\xc4\x9e\xeb\xf8k\x97r\x9c\xd9w,\xf0\xe2\t\xfb\xc6|\x920F\xb8=Aj\xf1\xb9\x16:\x98\x99\x98\xf2G\x1fw\x1e\x0e\xaa\xfc\x85\x19\x0b4\xddV\x8fH\xb4\x94\xeeH\x1e\x01\x1d\xd4\xfc\xf4\xa4\x80\x82\xadx\\,;\x92H\x82E;~\xd2%\xe2\x8cO\xdeO\xe0o\xa7\xcb\xe5\xa4\xe4\xa7`+\x01i\x95\xea\xe1M\x1c\t[\x11\xf8\x9c\x90#\xff\x00\xae\x83\x14m/\xbe\xca\x0e\x13}\xb7\xba\xaaf\xa5Zy\x98\x80Ga\x9c\xe3\xf0\xfe\xfa\xd2k\xc2\xee\xf4\x88\xa9\xb8\x05\x05\x85r\xa6O`O\x8dT\xb8\x05\x16\x877Z\xc4\xf8\xe2\x99e\x03!\x95[T\xb0WX]\xad\xdb\xc6zI\xb9D\xef\x04\x87\xeb\xd8\xff\x00\xa6\xaa\\\xdb\xa2\xa4eUY\xb7\x90\xbb\xcb\x1b\x89\xfd\x1b\x94#(\xcap%\x1e\xe3\xf1\xd5ZK\x0e\x17*\x07\xb9Gw\x89+\xa3B\x0e\n\xca\x87\xf7[\xfe\xfaOR\xd3\x1b\xb77\x82\xb9,\xb8\xb4t\xb4\xed3/\xde\xec>\x9a\x03e\xd9\x19+\x94\xbd}\xc1g\xdc\xf6\xfab\xb9\x1fj\x8b\x90\xfc\x18ixfk\xb5\x00)?-\xaa\xed\xcd^\x88\x87\x93\x1f\x80\x11\xc7\xe7\xadi%\xb7*\x0c\x05\x19Zfw`\xa3\x00\x8c\xaa\x01\xef\xf5\xd0\x8c\x96)[\x94\xa7ql\xaf\xf6\x81\x0c[\x1a\xb0+\xdb&\x91%\xbf+\xb7\xc3QN\xbd\xc5)_,$n<\x87\x8fLH\xa7\xbb\xae\x9d\x88S,\xaeZm\x0c\x11\xa4h\xbe\x9f\x1f\x01B\x8d2\xd2)reMW\r\x00v\x97!\x01\xee=\xd8\xfd4\tH"\x97$\xb7\x0b\x84/4\x93\xcb\x18\r\x9e\xca;\xe3Ch\xda\x03B\xe4\xbf\xed\xb19\xe6T\x02Ol\xe8\xed\x1eW!n\xf7\xf8\x92\x16\x82\x19?hs\xf7F\x8c\x1c8\\\x91\xa2UV\xb9\xee\xccI\xee\x07\xb9\xf9h\x8d"\x89\\p\xb4\xa6\xdbi[\x18u\x88\x06#\xe1c\xe0\xe9\xb2/\x84\x0b!)\xbam:\x98\xb9\x95\xa4\n\xe3\xc3)\xec\xc3Bp!H&\xd2*\xeb|\x91;\x19)\x1e)=\xc1=\x8e\x86\xe0A\xb5rm\tQU,I\xe9\xb9\x93\x04wW\xf6\xd0\x9c\xea4T\x81aNnA\x92\xce\x99ea\xd8g\xc6\x83!\xb2\xacr\xa2\xea\xe2hf\xf5\xe2P\x00\xf6\x1aJL\x1b\n\xcdE%A\xae\xa6\xe2\tfN\xea\xba\xa4o\x02\xca\xea$\xa2-\xd3K\x13\xe4\x16\xe5\x8c*\x8c\xea\xb2j\xe3\x8c\xd9+\xb6\x94\xf6\x8e\x07\xb8\xc4\xd3\xbcA@\x18=\xbb\xe99\xb5\xb2m\xdc\xd1aue\x01p\xa4JYK$\xec\x87=\x8a\xf6\xd6[\xfa\xa4\x834\x8a\x19\x84)\xae\x9a5\xc4\xc7\xd6Q\xe1\xb3\xdfB\x8f\xae\xc6]\xb1\xfc\xab\x98\x88\x08\x8a+\xc4\xb0J\x19fa\xc1\xc1G\x07\xb8>\xdav\x1e\xaa\xc7\x11\x95S\x11\xa5\xa5l\xdd\xcb\xfa\xce\x93\xd7\x91\xb0\xcc8\xd4\x00?{\xd9\xb5\xa8\xf9\x1b44\x80A\x08\x8d\xc1Z\x1a\x826\x0c2;\x90O\xd7^zMH\xf4\xf6\x92\xae\xd6\x95\x1dM<\x95{\xda\x95\xd0\x90#\x91X\xf7\xfea\xa1\xe9go\xae\xd3\xf6\xfd\xd1\x1c\x05*\xfb\xb5JMS)\x90\x12O\xdc\xfakW\xf1-s\x8a\r\x14\x96i\x11eW\xa9\x1f\x070\xaa\x84\xfd\xf2H\x00\x7f\xa7\xe7\xa3\xe9]\xeb\xbdA\x14\xa8vm\x84[\xe9~!\xceY~9e\x03\x1c\xdb\xf8\x8f\xf9\x01\xec;\x0e\xc3[!\xc0\x1a\n\x11\xb7:\xf7\xb7\xc4\x07.\xfc\xfd\x86\xa2ICW%7\x0b\xbc\xb2T\x86\x12\x90\x02\xf6\\\xf8\xfa\xe8\x02l\x92W%\xd2\xdc\x1aU"J\x82[8-\x9f\x1a4N\xb1er\x12\xe5wX\xa1\xfb=;\x92|gF\x04\x95\xcb\x95\x9a\xcb-\xca\xa3\x99\r\x8f,\xc4\xe8\xcd\xa6\x8c\xaeH:\xb7I\xd4\r\xdf\x1b\xf4\xf7\xa5\x8d\x15\xba\x9d\x93\x8d\xdbpT\xbb(\x8dO\x98 U\x1c\xa4r\x0eK\x8f\x80\x03\x8e\\\xb2\x16\xee\x8d\xd2\x8a\x06\x82\xa6\xe2\x80\xe97\xe91\xb86\x8bEl\xbd\x13s\xb7\xa8\xc2\xd3\xcb&$\x88\x7f#\x1fa\xfc\'\xb7\xcb\x1aR-c\xdb\xca#\x98\xd3\xc2\xdf6\x87V\xfaO\xd4\x1at\x8e\x8e\xfd\x145\x0e0\xf4u\x9f\xb2\x91I\xf6\x1c\xbb7\x7fu$kA\x9a\x88\xe5\x18(%\x94\x8f\xbc\xec\xa8*)\xcf\t\xbdhH\xf8\x1dXr_\xfa\xe8\x84[Ur\xa276\xd8\xac\xa1\x84\x8a\x95\xca\xa9\xf8eO8\xfc4\xb4\x8d\xb0\xae\xc2\xa2o\x94|I\x85\xaa\x06Yr\x8d\x8e\xcc>_C\xa5\x1e\xec\xed(\x8aF\xe7O\x1a\xbeQ\xc9\r\x91\xc7\xe4t\xa4\x84\x10\xa4r\x95\xc57\xd9\xaar\x0e@>3\xa4\x1cj\xd19NbFp\x1a\x95\xf8\xcf\x8eQ\x90{0\xf9~:Bs#M\x14K\xb5\xdfon\xc9(\xebq:\x13\xcb\xb4\xd0\xe7\x01\xc7\xcc|\x8f\xd3H7Y\xf8|\xf2\xde\xe3\xfc}U\xdd\x18!6\xbdCOSL+\xe8\xa4\x12\xc1!<H\xecA\xf3\xc4\xfc\x88\xd2:\xb7\xb5\xa7{\r\xb4\xf7\xf0\xa6;\xaa!H\xd5\xcd%+\x11\x13\x11\xdf\xdck\x0bW#\x1f\x19.Eo(\xcb|\xb1VQ\x8a\xb8\xfe\x16\xf0\xe3=\x89\xd7\x93\x1doU\xa0\xd7\x08\xa4u\xb1\xdc\x1f\x1ft\xcf\xa6\xc7\xb6\xc0T[\n\xeb5\x1d\xd1i\x99\x88I{\x1e\xfe~Z\xfa\'J\xeb\xa2H\xcb\\\xe4\x94\xd0VUE\xea\xbf(bbq\x1cE\x89\xf6\xfb\xda\xf3\x9a\xce\xbb\x08\xd7\xbe&\xbf!Y\x90\x9fL\x12\xa66uW\xda\xb7$\x95\xc1\x8f\x15\xaaT\x19\xfa\x1c\x9d\x13K\xd6c2\x80\x1dy\xfe\x15\x9d\x11\xda\xb4\x0bm\x1cWP\xe0\xd5\x08\xcf\x80\xe4v\xc9\xc99\xf1\xd8\x01\xfd\xf5\xa7\xa8\xea\xd3\xe9\xdb\x14p7s\xde@\xaf\xf8\xd8.\'\xec\x0f)v\xc6\x1co\xb2\x82\xdb\xbb\x9a\x1d\xf5\xd6z\xfd\x9ff\xbbE%\x1e\xd0\xa5\x8c\xdeR\x1f\x88\xcb_RO\xa5\x1f/e\x86\x18\xe4fLwj\x98NG\xa6A\xf6\xfd=\xde\x9c%\xc4\xe7\xfd\xfe\x12\xee\xe5kP!\xa5\xa7\xe4\x87\x88T\xc7}h6Z\xb7*\xa9=\xc3t\x91\xeb\x96\'\xa8\xe4\x179\x03\xdc\xe8O\xd4[\xf2\xba\x88\xcaZ\x93%D\xe4\xc8\xb2\x16\xf9\xfb\rZ"v\xe5A\xe1\x15\x1d\x0f\xac\x87\x8cX\x03\xe6q\xa7\xa3kH\xca\xe2W\x83Gi_\x80\xd7,\xb3\x7f\xe4\xc09c\xf1a\xd8i\xa6\xechU\xca\xedMAYP\xa5\'\xab0S\xe7\xbcQ\x9f\x88\xfe\'W.iV\x1c"\x96\xb2\xcfl\x8f\xd2\x81\x87\xd3=\xc9\xd4\xef\xb5\xd4\x17\xe5\xe1G(\x00\xf1!\xfd\xfd\x8e\xb1\xc9\xb4TU-\xc6\xb6\x95G\x04/\x8f#\xdf\x1e\xff\x00\xfc\xef\xae\xb2\x15\x83|\xab\xde\x9f~\x90[\xe7i2%%\xdeG\x85p\x1a\x9e\xa9\xc9\x18\xf9\x03\xe4}<\x81\xf2\xd31j\xa5guGF;-sl~\x91\x9bos\xc4)o\xb4)\x14\x8d\xd8\x82\x00\xe4\x0f\xd7\xee\xb7\xf6?M:\xcd\\r|\xc8E\x85\xab\xb6\xe2\xda\xf6\xbb\xad!\xb9m\xe7Y\xe3#>\x988*~X\xf6:\xab\xda\xceB\x80J\xcd\xf7\x05\x96JY\x19\r+\x18\xcfu+\xf7\x90\xfc\x88\xd2R4\x01\xc2\xb5\xa8\xbb\xc4/\x0c\x82hC\x02s\xd8\x8f:\xca\x98\x96\xe5\x18e\x1b\xb6n\xb1]Q\xad\x13HR\xa4w\xa5l\xe3$~\xeet\x83\xa6d\x8c,<\xf6W\r<\x85\xf6\xe9\x19\xb8\xc5%bFc\xab\xa68\xab\x88\x0e\xe7\xf9\xc7\xd3\xe7\xaf1\xd4\'s#.o\xe6\x99`\xceWk\x1e\xe1\xaf\xb71\x92d\xcaH\x80\xcd\x1c\x80\xf1\x94x\r\x8f\x9f\xd7^\x17W\xf1K4l{\x9aw\x01`\x8f\xe3\xe8S\xbf\x84\xde@8]+\xe8M\xe2h\xe5\xb5\x85h\xe6p\x0b3c\xd1\xc9\x19\xe4\x06Oa\x93\xdb9\x1e5\xe5:\x87\xc6p\xb9\x8c\x92\x12Fr+5\x9c"\xb3H\xf6\xb8\x82\x82\x8e\x9a\xefj\xbbG\xb7)i}j\x99\x9b\xd4\x8c\xab\xe27L\x16$1\xc0$\x01\xe3\xf2\xf3\x8dy-GY:\xc7\xbbPI\r\x00c\xb8#\xe9\xf5)\x83\x17\xa6\xd0\xd1\xca\xa3\xd8\xf50\\.t\xd2\x00\xca\x19\x89R\xc3\x00\x80pH\'\xc8\x04\x11\xadM7\xc5\x8f\xd2FK\xcdVU\x1d\xa7\x12vV\xb51ERja\x9a\xaa\x9e5\xabY"\xa0\xaa\x12s\xe5 8!\xd3\xb7\x10\x1c0\xc9\'8\xf6\xf7\xf1\x1a\xae\xbb\xaa=RMk\t\xb7\x1bp\xff\x00\x89\xec\x0f\x9e\nz=&\xf8\xb6\xd7\nN\xc7MW\r\xfe-\xbfo\xa6\x91\x9a\x97\x94\xf7I\xc2abf\xe3\xe9\xa7o\x04\xa9$\x0f8BN5\xeb\xfe\x19\xea:\x89\xb5\xac\x8d\xc6\xb7\x1a\x04\x9ey\xb2O\x81@ZKQ\x11\x02\xc0\xe1?\xdc\xf5\xfb\x9e\x96\xc756\xd5\xb1\x9a\xea\xf2\x9e\x95\xa6\xdf,\xe2\x05\xac\xa9 p\x0f+ab\x8f\x969HH\x00\x03\xdf\xb6\xbe\x95\'\xc5\xfa&k\xbd\x00\xea\x8d\xb4\x1c@\xb3Wg\x8b>(\x01d\xac\xf6\xe9\x0e\xc2{\xac\xdf\xff\x00\xa7\x0e\xc7\xbbmn\x94\xdd\xb7>\xea\xbb-u\xd7q\xee\x9a\xdb\x95mcS\xc9\x13I!+\x1b\xe5\x1c\x021"I\xf4\xd7\xd3\xe2\xeaq\x17\x86\x0c\x10\x06\rw\xfb\x1f\x14\xb3\x8c/h\xca\xdd\xf7\x15\xda*zFST]\x9d\x8e\x02\xe9\xb7k\xef\xda\n\xa0b\x92.\xf3Ne\x9202{\x16\xd3\x9aR_\x97(x\xf0\xbc\x8b\x89O\xd9QG\xc9\xc7\xb7\xbf\xe6}\xb5\xab\x1c\xaco\xb5\xaa\x9bJ\xf32\xbc\xd1\xfa\xb7\xcb\x89H\x87\xfe\x18n\xc7\xf3\xf7\xd3\x1e\xa3\x8f*)\r\xfe/\xa3\xa4&\x96\xc9E\x9c~\xf0_:3e\x05u/\xef\xd6w*\xbc\xc9YVc\x8c\x8e\xe1tm\xc0\x05\xcb\xdf\xeb\x1aT\\\xa82\x1f\xe3=\xb1\xab\x83\x85\xcb3\xac\xd9u\xbe\x9f\xadFV\xad\x07\xdf\x10\x0c\xb8\xff\x00\x93\xc9\x1f\x818\xf7\xd2\xaf\xd38e\xb9V\x05)\x96\xd0\x17*\x8c\xdd\x8f`\xa3\xc64\xb9i\n\xc1\xc8j\xabc\xe0I\xc1\x94\x8f|\xf7\x1a\x19%\\\x1b\\\xe2\xad\xa8\xb7\x8cA#\xb6\x0eJ7\xfah^\xa0\xbb\\@*\xbbcu\x9a\xeb`\x99\x14UH#\x03\x01\x1c\xfd\xd1\xf2\xfa\x8f\xa6\x8d\x16\xad\xcd\xc1\xe1Q\xd1\x920\xb4JM\xf1\xb5\xf7\x8d05\xc5a\x97\x18\x12\xc5\xe0}J\xf9\x1al\xcf\x13\xdbHE\xa4)\xdd\xe1\xb4\x9e\x18\x1f\xec\xd2\xac\xa8\xe31H\xa7\xe1\'\xfd4\x84\xec\x0ee+4\xd1\xca\xcd.\xf2\xd5QV\xf2\x8d\x82H\x1b\xca\x9c\x15#\xdf^+\xa9L\xe8M\x84\xfcM/\x14\xaa\xa9*&\xbf\t*g\x9e*[\x95=>*\x04\xb2qI\x00\x03\xb9o\x1d\xfe\x9f]|\x87\xe2\x8f\x8b\x84\xba\x11\xe8]I\x8b\x1d\x88\xf29\xbf!j\xe9\xb4\x80>\xdc8N\xf7%\x8e\x82\xd9AJ\xb6\xdb\xad\xb5\xe6j4\x92\x9e\x8e\xa6\xa9c\xaa\x92Le\xa3\x80\x9c\xa3\xb1\'\n\x84\xfcY\xc2\xf28\xd7\xc9\xc6\xafS\xae\xd4\xbc\x90[n7B\xdb\xcf&\x8d\xfd\xcek\xfa\xb6\xadF\xb1\xac\xab+\xb5\xd6\xdd\xb9/\x95\xb7\nKM\x96:\x0b\x8de\xa4\xc9d\xbaH\x85)\xeaS81\xc9\xff\x00\x97)R\x98\xed\xe0\x9c\x9e\xd9\xd2\xccn\x9a0\xd7M%\xb0:\x9c\x0eH\xe4\xd8\xf2\xd1\xdf\xb7\xd5D\x8f\xac\xb5\x17\xb7\xfawk\x93\xa4\x8f\xf6\xdb\x85\xd0]\xed\x0c\xb5uu\x13\xc8=(gU*\xe8\xc5\x10\x80\x88Y\xbb\x02y\x85\x01\xb2\x18\x8dL\xba\xe7G\xd4\x8e\xc8\xc1c\x8dpM\x8el\xe6\xed\xdc};f\x95\x1c\xfb\x01\xc52\xdb;o{n{\xd4\x15\xf4\x94\x14IC\r\xb2A-\xae\x82\xa3\xec\xea\xb5\xee\xe0\xbc\x91\x86*LG\x93\xb9\x1f\x03c\xe1\x00d\x1d/\xa9\x97I\x0b\x1dd\xee.$8\x8b\xf6\x0b\xc1\xf0p\x05w\xe7\xc8Bl\x96\xeb\x1c\x0f\xee\xa9\xea:}i\xb9n\xba]\xef\x15\x7f\xdb\xed\xf4\xd0\xa40[\xe3c\x11Y\x89f\xf8\xfb\x96\xe1\x92q\xc7\'\'\xe2#\x199_\x8d-\xd2\xba-\xb4\xe2Nn\xf1\xf4\xfd\xfe\xc9\xb8\xe4{l\x03\x82\x8c\x8bh\xdc\x92\xfd]O@!\x10\x96T\xb6\xd2L\x9e\x9dF\x02\xb1nm\x8e,\xc4\xf8r{\xf2\x00\xfc\xf4m7Sv\x8bl\x8c$>\x88\'\x90\x03\x8e\x08\xee\x062>\xea(H\xda\xa4\x93n\xef\xab<\x10H)\xa9\xe7\xb7S,&\xa6j\x89\x91\x832\xb3\x00\x1c\xe7\xb9\x05\x98`\x0f88\xf0q\xa9\x07P\xeb\x1a\x19\xdb$R{\xb7gos\xe0\xf1\x7fP\xa5\xf0\xc5\xe8\xd9\xee\x8cZ\xdak\x8cF\xf1KY-I\xc9"R\x00\xecG\x8f\xa8?\xdb\x1a\xf6\x9a/\xfcC\xebR\xea\x19\x06\xa0\x02l\x0b7u\xe1f\xcb\xd3\xe2km\xaa~\xfb\xb9!\x8e\xa3\x84\xcc\xc5\x87\x80\xbd\xf1\xaf\xb1\xf4n\xb2\xc9\xce\xf6\xfb\x8a\xcb\x92\x1d\xa3(zz\x9a\xbb\xa2\x83?(\xa2?\xd4\x8d{]4\xefx\xb9\r%\x0bE\xaf\x17\x1b\xf5\x1d\xa2\x98\xd3\xd1\xa0g\xf7o\xae\xb6c\xd44\x8c!\xed)\x0c\xf55\x17i\x83\xd6\xd5\xb1\xc9\xec\xa0v\x1an7=\xc6\xadT\x9aL\xed\xb6k\x83*\xfd\x85J\xae~\xf0\xf7\xd3\xad\x07\x81\xca\xa5\xdf)\xed\x0e\xcf\xab\x9c\xabTM)c\xf3^\xdai\x99P\x9c\xc1\xb5`\x83\xf6\x95\xf5P(\xf91\xd1\xac\x8c.Y}U=U\xb2_V\'\x18\xf6#M].^\x9e]\xb9\xb9I\x8a\xf0\x1a\x9a\xac\xae#\xac\x8b\xefg\xc7\xc4<8\xc7o\x9f\xd7\xdbKH\xc8\xe49\x0b\xb8J\xef\xdb>\xe3gO\xb4\xd4\xd3\xfd\xa2\x9d\xff\x00\xdd\xd6\xc1\x96\x8d\xfe\x84\xf9S\xfc\xad\x83\xee24\xa4\x9a}\xa2\xc2\x90\xe4\x92\xa2\xdb4\xb1\xfa\xf1@\x00\x1e\xf8\x1d\xb4\xa3\xe2\x7f!Y\xaf\xa2\x95\xd6\xda\xaa\xe3&I\x1b+\xe0\xb0Q\xdbJ\xb9\xaef\n(6\x10\xf4\xf7K\x8d\x9aQ\xe8\xd6\xb8+\xde6Q\xed\xa5\x9f)iD\xda\xd7&\xd4\x1dQ\xdd\x16\xb8\x83X\xaeTfA0ymw\x80~\xc7R\xbf\xbe\xa1\xd4\x17\xa7s\xed"\xf2P{\xb4o\x9c\x80\x1e\xa1\xe8\xfc\xfc*\xba\x10x\\\x9e\xe1\xb6\xfa\x8ft\x96\x95lW}\xb9q\x82eZ\x8a\x0b\x9cJ\xf1\xc88\x87\xe5\x0c\xd1\x9e2\xa1\x1e\x1b\x03\xe5\xd8\xf6\xd7\xce\xfe/\xf8\x8f\xa7h#p\x07\xdcA\xab\xfd9\xed\x94\xfe\x8fK)\xc9\xe1V\x7f\x86\xb6\xdd5{Mt\xdd5iGKNjc\x8e\x9e!\xea\xc2\xaa\xc0\x00\xc4\x86\xe5\x1eG\x13\x903\xdb\xb8\xecO\xe7Ig\xd5n \xb0o.\xa3g\x04\x9c\xd8\xcf#\x91\xd9z\x00\xc6\xb8\x84\xef\xa6\x97\xbd\x87\xbcx\xeem\xbfZ\xb6\xea\xbb-\xbaj*J\xfb\x94i.e\xe2\t\x95\x80\xe3\xe0\x10\xa3\x1f\x17\xc4{\xb1\xc6\x15\xd7\xc3\xaa\xd2;\xd1\x7f\xcb!\x04\x86\xd85|s\x9b\xef~\x06\x00\xb0\xa1\xc0\x84\xfe\xabs[\xaav\r\xae\xbe\xe5}\x8a\xe2\xd4\xd7@\xc6\x11\x03\x85\x902\xb1c\x13\xa1\xe4\xc0d\x96\x07\xca\x8c\xe3 i6\xc6\xe7N\xe8\x9a\x08\xc7z\xc0\xc1\xcf\xf1\xf5!\x05\xee ]\xaf\x14\xb77\x16\x99\xf7\x17L\xb7\nz\x12\xd4\xc6\x8bew\xe4\xf2F\xec\x0bpyXrnD\xbe\x0ep1\x96\xc6\xac\xed8\x91\xdbg\xf6\xb8w\xae\x0f\xd8_\xdb\xf8A2Riw\xdc\xbb\x9e\x9bq\xd0\xd2n{\xec[~t\xa0d\xb6U2%RV\xb7\x95w\xe3 \xe2\xab\xf7q\xf7\xf0\xf9\x00v$\x1f\x85\x87\xd3$\xdc\x83\xb8\x06\x8bG\x8f\xe7\xf6*\xa2P8\tu\xa7\x7f\xd9\xae\x16jK5\x81\x8d%\xcaj\xb6ZZ\x9a\x96\xa8h\x98\'.e\xc98q\xcb\xc3`\x03\x9c)\x18\xc6\xa6M\x0c\xac{\x9d(\xb6\x81\xda\xaf5@W\xdf!\x18J\x15]%\xe2\xacWU\xdb\xf7\rj\xcdX)\xfe\xcfCs\xa3\xf5\x19\x10\xc8\x84\xc3\xc4`|Ya\x95n\xe7\x00\xf8 \xeb4\xc2\x1a\xd6\xbe1l\xb0h\xfd\x0ew_a\xe4\n\xe4r\x8e$\xdc,\x1aG\xdc\xe4\xaf\xbfl\xd2\x94\x94\xf4\x91\xd7\xd2\xc4XQ\xdc\xe9@s\x84#\xd0\x95\x8fe?\x17l\xf6\xca\xf9\xf7\xd0\xe3\r\x87QN\'i<\xb7<\xf7\xfc\xd5\xc1\x04\x8caF\xeeK\xce\xe0\xb4\xd2\xd1\xd9\xb7\r\xb2\xe8k\xea\xe02\xb5\r%\x0f#\x06H\xe2=Q\xf0\x01\xc5\\\xb7\xde\x03\xe68\xe7ZZh#s\x9c\xf8\xc8\xda/7\xc8\xac\xe3\xfb+\xb8\xb5\xd2SW\x1a\x94\x86\xc5\x04"\x08\xe3\x86\xa6\xacs\xaa2I\xcd\xd5\x8f~\n\xc7\xbf\x15\xfb\xbe;\xe3\xbeN\xbe\xf7\xd3\xba\xd7O\xf8/\xa7@\xd3\xef\x96@\x0b\x88\x02\xcf\xef\x808\x03\x8bXRB\xfdc\xcd`\x0e\x17\x99j\xcc\x91\xb4un\x18\x05\xfb\xd1\x9c\x91\xf5\x04k\xe9]\x07\xe2n\x99\xf1<>\xdf\xedD,\xe9\xb4\xf2i\xdd\x94\x8et\xb5\xd1\xbf\x1b\x84\xa6C\xe5YW\xd8\xfd5\xe9!\x84B\xfa$Wd\x0c\x91\x84\xca\xd3]\xb5\xca\xf1\x12q\xc7\x91$}\xbf\xb6\xb6a\xd9\xe4 \xba\xc1O\xe9n\xd6\xa8T-%\x02\x96\xce\x15\x83`g\xf0\xc6\x9e\x8c6\xee\xd5l\x95\xdcOx\xac^p\\~/\xe1\x8d\x80\x00i\x88\xd8G\x0b\x97H,\x17\xe9\xfe)\xa9\xdd\xbee\xbd\xff\x00\r\x15\xac\xbeUw\x05\x01x\x06\x9f\xb8\xc6\x08\xfb\xa7\xbe\x99-VR\xb7Z\xe8\xa9$%\xe9X\x8c\xf6#\xb6\x96\x7f\xd1p\xca\xf7\xb7z\x93]\xb7\xaaA\xa4\xad\xf4\xb9\x0e2E*\x86Y\x17\xdc2\x90A\x1f\x8et1.\xd55\xe1Z\xed\xfb\x8fI\xb7\xbc\x8b\x1d\xce\x99,\xd5\xd2\x1c\tb\x95\x96\x96F\xf9\xe3#\xd3\xcf\xd4\xe3?\x8e\xac\xd7\xc3)\xa3\x82\xaaZP\xbb\xef\xa66-\xa3Ln7\x8a\x1b\x92\xd0\xc9\xdc\\\xe8\x1b\xd6\xa7Q\xfc\xd8C\xc0}X\x81\xf5\xd2\xda\x8d;\x1b\x92\tR\xd2n\x94\x05E\x8bm\xdfT\xc5\xb6\xb7\xad\xba\xa8\x1f\xba$\xc2\x11\xf2\xfb\xa5\xbf\xafmbN\xc8\x1d\xc3\xab\xee\x8e\xc78vR\xbb\xa7`o\xeag\x8e\x8e\x92\xcd\x14\xc94\x8a\x86\xae\x9e\xa9$H\xc1 r`\xa4\xb0\x03=\xf25\xe5\xba\xbc\xa3G\xa7t\xae \x86\x8b\xa0E\x9f4\x13\x91\x11#\xaa\x95OM\xb6\xcd\xafh\xdad\xa2\xde\xfb\xab\xed\xd78]j\xed\xd0Q(x\xa1\x08rS\x93\x9c>IS\xc0\x81\xd8\xb6\t\xceW\xf3\x8f\xc4\xbdr~\xb1\xa9i\xd3\xc5\xb5\x82\xc1\xb3\x93\x7fA\x91\xfe\xdd/C\xa5\x84F=\xc5P\xec\xca\x9bF\xfaYk/;j\xa2\x96\xa6\xa2\'[_\xead\x04WS\x07e&x\x00\x93\n\x1c\x14#\n\x08\'8\x1a\xc0\xd4F\xfd.\xd0\xc7\xee\x18\xbb\xfe\x93\xff\x00\x126\xe7\xbf\xf9Vq\x16|#-\x9b\x1a\x03\xb7?\xc6\xd6\x8d\xb3g\xb4\xdc\xac\xed#^\xac\x91+S\xadX\x8c\x90\xb2<`\x18\xd6NJ\xc5|\x86\xcff\x03\x03C\x97T\xe7O\xf8yd.\x0e\xf9\\}\xd4Ok\xc1<\xfd\xfc\xa5\x9c\xe7\x11\x8e\x11Kp\xdcvn\xa7\xd9\xaf\xdbj\xd5hi\xafV\xb6\xf4E%\x7f\xa2\xa2X\xdc\t\x19\x96@\xaa\x81\xc3\xa0c\x18r\xc7\x19\xc7|\xc8l3\xe8^\xe9\x1cF\xc7\x0b\xb6\x93\x87\n\x1c\x1bw\x1fA\xfb%\x8b\xcby\xe1Cn=\xd3E\xb2\xa8n\x16\xfa\xe8j\xa2\xdc\xb47\x80\xafD\xd5\xc5\xa0r\xe4\xf2D\xf8p\xa9\xc1\xd5\x94\x80\x07\x10\xa3\xb6\xb4a\xd2;XC\x9a\xdb\x8c\x8f\x9874\x07&\xcf$\x8a?[K:b\t\x08\xed\xa3\xd6]\xcc\xfb\x92w\xdc[^\x0b\x8d\x05J\xfd\x8a\tkPMF\x14 &\x0f]\xc0\x8dp\xfc\x88\xca\xe7\xe1\x00\x96#&%\xe9\x90\xb2\x10`\x93i\x16O6\t\xbav\xdc\x9e+\x17_`P\x8c\xc5\xe6\xd5$\xfb\xce\xedi\xb7\xd2\xf4\x8frn\xbbm5=\xd5"\x92\xdbq\xa6\x94L \x86\'NN`\xf8\x1deU\xe3\xc4\x10U\xbd\xf2\xa3\x1a\xcf\xfc\x1c[\xce\xb1\xad.\r\'sq\xcb\x87\x1b\xb3\x83\xc9\xee(&\x1b\xa8\xc7\xd54\xd9W\xfe\xacU\xd2]zqo6\xda\xab\x8d\xber\x8bU\xf6\xd5\x8c\xdc\x11\x91dGL\xe4\x02\xc0\xa0\x01\xd8(c\x82p4\x8e\xabE\xd3\x1b#\'\xdcC]\xc0\xab\x00\xd9\x06\xfb\xd0#&\xb8\xcar9C\xb9\n\xc2\xd7Y\xb8/\x14\xf6\xfd\xd7\xb9id{r\xc4\x91C\r5a\xf5!.\x03s\x9c(9\x1e\xcb\xdf\x03$09\xc6\xb2\x9f\x140F\xe6Fm\xc0\xe7\x1f\x7f\x97\xf5\xf1\x7fT\xd0v\xef\x95z\xdc\xb6\xfe\xa0n\xca*[\xdd\xb6Zg\xb4\xdb\xdeIZ\tf+QW\x1a\xb7\xec\xc1P0W\x00\x903\xdc\xb0\xce\xa9\x00\xd1\xc0\xe3\x13\xac\xbd\xd40,\x02y\xcf?\xee\x11\xda\xebu\xb8`%\x17}\x9b\xc2\xf7[\xbf7\xbb\xc5Tdx\xa1\xb2\xda)\xea\x1b\x11!\x18&A\x80\x1aFol\x95\xc0\xfd\xe3\x82\xbe\xf3\xa0u\xde\x95\x04\x8d\x83]\xa7t\xef\x03%\xdc\x0f\xd6\xc9\xe7\x16Ew\xb4\x86\xa2)\\\xed\xcd4>\x8b\xf9v\xed=\xd2\x11[CH\xf0\x12}6\x96\x19\xbdH\xd5\xff\x00\x85\xd7\xbe\x0fq\xe0\x8e\xdf\x9e\xbe\xc5\xd0\xf5=\x12=l"\x18\xbd7;\x16\xcc\xb2\xfc\x1a\xf6\xdf|\xd1#\x85\x930\x9a\x8d\x9bR71\xbb\xa1\xba\xcdnM\xadm\x96\x1aw\xe1\x05l\xd7\xae\x0b(\xfe.+\x0c\x87\x19\xc8\xc1*N3\xdb:\xfa\xa4Lk\x88\xdf \xfc\x86?[H\xee\xae\x02\x16\xd9A\xbb\x92\xe6j\xb7GP-\xd1S\x02\x0cv\xfd\xbf\xb7x8\x1f&\xa9\xa9\x9ep\xe7\xfe\x18S\xf0\xd6\xacGJ\x05\x0b?\x9f\xff\x00Hn.&\xd3\xa8\xef\x90Q\x90\xb1WU\xca\xa1p\x05S\xc6X\xfc\xc9\x11\xc7\x1a\x93\xff\x00(\xd3\xec17\x80\xa8o\xba\xfe;\xc6\xb8\x9eP\xbb(\xc7o\x00\xff\x00m2\xc9\xa8(]!\xde\xb7\x15\xff\x00y4\xc4\x8f\xff\x00a\xd1\x84\x8e\xbc(\xa0\x81\x8e+\x80_FU\x1cq\xe1\x86O\xf4\xd3$\xa9@\xd5Y\x9e~P\xcfC\x9f\xab\x0c\x7fM.\\J\xee\x12K\xa6\xc9F\xc7\xaa\x8c\x84\xfd\xc6\xc6\x80\xe8\x81]t\x96\xcf\xb7.t\xa4\xa4n\x7f\x96U\xca\xe3\xf3\x1aNF;\x84@ZBi\xb5\xfa\x8d\xd5\x0e\x9fHc\xb5^O\xa2\xe7-O \xe7\x13}x\xe7\xb1\xfa\x8c\x1f\xae\x8253A\x8b\xc2\xb6\xc68 \xf7\xfd\x9b\xf4`\xeb\xa5BVu\x97\xa4\xc9h\xbc\x01\x8f\xf16\xdc\xf5)\xa5-\xfcN\xd0\xf1\x91\xbf\x07\xe7\xf3\xcf\xcco\xd7i$\xf6\xca\xda\xfa\xae0\xc9\xc8BM\xd0K>\xd74\xad\xd3\xed\xcb]\xba,M\x1b\x06\xa9\xac\xdd\xb2K<m\x8f\x07*\xc8\xff\x00\xf0\xe1\x08\xfe\xda\xf9\x8f\xc7\xba\xdd\x07N\xe9\xfe\xab\x9a\x0e\xec\n4\x7f\x9f\xec\xb4z|rH\xfa\xf0\x9a\xed\x84\xb3[\xadt\xd7\x9bM5\x15\x15\x15\x9e\xe0MT79\xda:\xd7~9<e@\\)\x07#\x00\xa9\xee\x18c\xb8\xfc\xe9\xa9\x96ifsey%\xe0\xd6\xdc\x81g\x16\x0f\x7f=\xef!z2\xc6\x81M\t\x8dM\xde\xef\xb6\xf6\xdc\x1dF\xb6\xbd\xa2\n4\x87\x91\xa6\xa4V\xf5\xe4\x86W\x88\xab\xbc\x8a\xa4\x11\xdd]\x97\xcf\x92{\x8d\x03\xd2\x8fQ)\xd2I\xbbu\xf2x\xb1\xc8\x17\xfa\x7f\x94\x07\x10\r\xa4\x96*\xa8-\xf7J\xabwXk+k\xe8\xeb\xf2\xd1\xd3\xc3\x1b\xc1\x15Q$r0<c\x94\xfcX\xe5@-\x82;\x8f\x03N\xbe2\x03\x1f\xa5`\x04w\xb0Mg\x9c\x90\xdb\xf3B\xd2O\x90\x93Ag\xbb\xab\x7fVlM\xff\x00]x\xbb\xdd\xaeTq\xd1TKMe\xb2^\xd2X^zPW\x8c\x88dT\xcb3\xa9\xf8\xc2\x8cc\x89\xee\x0e\xb6\xe1\xe9\xcd\xd5h\x99\x1cl\x07p\x0es\x9bF\x8el\x1a\xc8\x00f\x8f\xdcvK\xbaR\xa8\xef\x7f\xa4\x8fS66\xc5\xa8\xa0\xea^\xc7\xaf\xa7\xff\x00\x15=]\x19\x8a\x9a\xb2\x07\x8dD\x84\x86\x97\xd4V<HV\xe5\xdcy\xc7c\xdb*i\xba\x06\x8fS\xac\x0e\xd2\xce\xd2"\x01\xd9\x04\x1c\x1b\xaa9\xe4v\xaeR\x85\xd7u\xddM\xc1\xb4\xfa\x89\x06\xdbk_No\xb2V\xf4\xe2\x96\x15\xa8\xab\xb9\x19\xd2J\xdbl\xcaAH\xfd#\x96\x95CH\x18\xbf\x15!Y\x81\xc7\x1dh\x89\xba|\xb2\x99u-\xadO\x1bk\xda\xe1\xdc\xdd\xe0\xd0 \x0f#\x08V[\x85M\xb4\xad\xb1\xed\x87\xb6\xed/\xd2CnV\x08\xddV\xe3n\xa8\xa5\xaffz\x89\xb1\xc3\xd4Y #\x93\x05P\x0cJ\xd9\n\xeb\xdb\xb8\xce~\xa9\xf2Ist\xd2\x086\xd2\x08\xc0\x1e\x085\xf5\xa7\x1c\xfdW0\xd9\xb7\'}5\xb8\xac\x9b^\x93\xa9=0\xa5\xbaV^m\xd5\x9e\x95\xe1\xa9)\xa4\x99\x1e\x95d\xe2\xfe\xba?v\x96%a\x8ca\x94\x00\x08*\t\x19\xda\xf8\x8f\xe2\x1d\xa3\xd5\x80\x18E\xb6\xcdf\x85m\xae\xce\xee8>l\xd2v\'\xd1\x14\xb4\xed\xa1g\x8fv\xda\xd6\xd1\xb1\xb7k\\-mLV\xe1n\xb8\xd7\x8530\x1f\x0ckT\xa4`\x102C\x0e\xdd\xbe-y\xcdK\xfd\tw\xcc\xc2\xc7\xdd\x82\x07\xef\xb4\xfe\xde|wO\xb1\xcf\xdbD\xaa;U\x8a\xd1f\xe9\xf5\xc6;\xee\xf4\xa8>\x8d\xbeqX\xa2\x15V\x8e\x9c\xaf\xc7\x14\\\x8b\x05e\xe5\x85\r\xc86\x00\xf2\x063_)\x93Z\xd7G\x10\xc9\x15\x9b\x04\xfdH\xf3\xdf\x8a\xe1h\x06\xb8\xc7\\\xa5\x9b.{T\x96\t\x95\xeb+\x02\xc1O\x1b\x89\xaf\xd1\xc3\x0cr\'/\x86N\x08\x1c\xc6;\x90[\x97~g#G\xd4\x99\x9b\xa9\x05\x80\x02O\xf4n$}\xf0/\xfc+\xd0h\xa2\xda\xaf+\x9c\xf4\x94\xd4\x8e\xb6\xbb\x04\x1f\xab\xe9\xaa\xe9#\x9a\xa6\x96\x9f\xb2\x06`\x0e\x00\x1d\xbbg\xfb\xeb\xea\xfd\x0fG>\x9b\xaalas\xe2\xf6\x11\xb9\xd5d\xb1\xae\xb2+\xdcAv;\x85\x8b<\xd1\xbd\x99\xc1\xca\xf4\xbb5*@u\xa9\x0f\x9f!\xbb`|\xb5\xf7\xdd\x05\x16\x8c\xe7\xbf\xfb\xfe\xfe\xab\x19\xee\xa2\xbe\xae\xc3\xb6\xbb|U!X\x1f\x0cu\xe94\xe3\x18A.]\x86\xc3\x85\xcf\x11\x18\xed\xe0\x91\xadF\x01yT&\xd7\xb1\xd3xI\xf5\tU#\xe5\xa2\xb4\x80\xefj\x85\xcaM\x88\xe8ra\xfa\x86\x03\xb6\x98\x04rW&\x0fc\xb14\x823uDs\xdf\x84\x98\xc8\xfc\xc6\x9f,\x04\xe1R\xc8F\x7f\x80\x92\xa20\x1b\xd2pO\xc3"\xb7\x91\xaa\xba\x1b\xe5F\xfc\xaeo\xd3\x85*c\xf4P\x8f\x99 \xff\x00N\xfa\x13\x9b\xb7\x95`\xe0Pu]7\x89\x94\xc4\x1c\x05a\x82\x18iw\xb1\xcf\nA\x05 \xb9\xf4\xb6\x02\xac\x82H\xd7\x07\xb3K"\xa8\xfe\xe7IK\xa6k\x87\nD\x84\x15\x17\xb9\xbad\xa9\x1bz\xb7\xdbr\xf9\xed\xeb1\xc7\xfe\x95#X\xda\xcd\x10\xdb\xf3\x81\xfa\xff\x00\t\x86JI\xe1B\xd3\xec=\xcbIwt\xdb\x97\x8ao\xb4\xcc\xa7\x06\x92wB@\x1d\xf2\n\x00\xc3\xbf\x825\xf1\xef\x8c\xa4\xd3\xe9\xe1s\xe4\x98P\xed[\x81\xfdx\xfb\x82\xb6\xb4vx\x19\xfb\xa6\xc2\xba\x8fs\xd0\'H\xb7\x8d\x1dEMe-\x13\xd5Mr\xb1\xd5`\x16\x05K\t\x96Tu\x8d\x18\xb8\x1c\xc3|\r\x80\x14r\xc0\xf8\xf6\xc6\xc0\xe3\xaf\x84S\t\xad\xae\xff\x00\xe3DY\xfa\x10l_\xbb\x0ba\xae\x90\n%+\xdb\xbb\x86\xcdj\xb1Um}\xcf\xb6Dr\xd0\xcb%-\x9e\xc7p\xad\x9d\xde\x94`*\x96\x8eN\xf2\xb1w\xf8\x0ex\x80\xa0\x0c`\xe1\xbd\\:\x87\xea\x1b4f\xcb\xc5\xb9\xc0\n>@\xae+\xbfs\xe5+-\xd1$\xa7\xdb\x8b\xad\x9b\xfa\x9a\xebn\xb0\xdf\xb6elF\xd3\x1f\xdb\xa6Z\xc9B\xc9Q3\xc0\xe8\x1a\x9d\x86U\xd4\x07\x19bG\xee\xf8\xce\x91\x8b\xa4\xe9\xc4\x0f{e\x14\xf3B\x85\xd0\xb0}\xc0\xe7\xec\x008\x18I=\xe1Du\xf7mu\x07\xaarY\xba\xb3\xd6\x8b\x15\xbe\xe1m\x8a\x98\xd2X-\x16y\xdaJ\xa8f\x91C\x07\x98 *X2\x80\x11Kw\xcf\x8dz\x0e\x87\xa8\xd1t\xd8\x9f\xa3\xe9\xcf;\xdcm\xee"\x9aCq\xed\xbc\x81\x9fq\xc5\xfdRS<\xbd\xd6\xa8\xf6\xcd\x8fcM\xd2*}\xdd\xbdwl\x17\xe1m/[_k\xb9S\x01K,,\x06HbC\xfa\xd1\xa8`r~"N\x11O\x103f\x9bW\x1fQ|\x1aX\xcce\xd4\xd0o$\xf3\xdb\x1bOo\xc8\x12\x87K\x13\xb8_\xeab\xa1\xdc\xfbO\xa3\xbb\x84[`\xba\xdc\xa3\xa5\xdb\x9bb\x9d\x9aj\x8a\x85\x98\xa0u\x8d\xdd\x89R\xc5\x9d\x819+\xe7\x90\xef\xafb\xcd<S\xea!\x9f[\x1e\xe2\xd6\xdb\xdep\xdb\x03\x16\x05\x03\xb7\xf7\xf0P$\x05\xabf\xe8\xe2o("\x8fv\xf5\x06\xd5Cw\x8bn3,V\xeb\x84\xe8\xf5\x16\xd6V\xc4\xd22/\xdf\x04\xf9N\xec\x00\xec=\xf5\xe3\xfa\x9f\xa3\xb8\xc3\xa5qk\x9d\xc9\x00\xd3\xbc\x0c\xff\x00q\xcd\xfd\x94\xb7"\xcaaI\xbbd\x9e\xd1\xbb:\xc5\xd2\x9d\xc3Ak\xb7\xc2~\xddMb\x86F*\xf1E\xff\x00\xe4<r\xaf\x11\x1b\xbe\x19\xd4q\xf2\x17\xbf|\x85\xa5\xd2D\xe9\xe0\xd1kZ\xe2\xff\x00\x94\xb8\x81\xc9>\xc0|\xb4p|\xf8)\xb8\xc8\xa0;+\xed\xb9x]\xf3i\xa4\xea7Glh\x1e\x9e(c\xbe-\xae\x9d$\xa7\x9a\x90\x06\xff\x00v\x81\x90=Bc\xc2)%W\r\xdc(\xd6&\xa2\x17B\xf7i\xba\x83\xac\x8b\xd9\xbb\xe6\xdcN\x019;O\x9b\xfd\x96\x8cn\x00\x84\xf6\x86\xbb\xa62\xd6P\x8d\xbf\ro\xd8\xa7\x8aW\xa8\x8a\xb6a$5\xf2a\x1b\xe3\xf5\xc1V|g\x92\xe7\xb7$8\x04gY\xceoQ\x8d\xae2V\xe1\xdc\n-\xe7\xc7\x1e\x07\xe7\xf5Z\x0c \xf0\xbd^m\xf5\xf1\xdf\xaa\xb6\xefN\xb6\x8a\xcdh\xe2\xb2T\xcdZ\x14,NH`\xb1\x19[\xbcx>\x10c\xbf\xbet8\x8co\x85\xb2\xea_Rd\x00;\x8e2+\x9f\xe1\x14\xbc?\x90J+pUY-3\xc5[w\x98\xc2g\xa4F\rM f\x88)\xe3\x87B~\x1flx\xce\x0f\xcb_@\xf8W\xe2-,%\x8c\xd5\xef SK\xa8v\xe2\x85d\x01B\xf9\xc2\xca\xd5i\x0b\xdeKy\xf0\xbeP\xd4Q]\xb0-;\xb2\t\xc9=\xa3\x91\xbd6\xfe\x84\xeb\xf4OEv\x8fS\x03_\xa7\x94\x10|\xe0\xac)\x83\xd8h\xb54\x82\xc5r\x81\x96J\xa8Kg\xc3\xc6y\x0f\xed\xaf_\x1c\x122\x92\xa4\x92S\x9bO\x0e\x07\x94\x7f\x1a\xf8\r\x9e\xfa\xd0c\x0f\x85^\xe9\xbd\x15\xbe\x1a\x8f\x88\xb1\x88\xe3\xba\x9e\xe3M0c\x0b\xac&i\xb7\xe1+\xc62\xb2\x03\xe4)\xc6\xae\x18\x0f+\xb7\x05\x9e_\xac\x14\x003B\xc7>rs\xdfZ\xc4aS)%\x0e\xf8\xbel\xd9\x88\xa1\xa9%|4R\x0eH\xdf\x88?\xe7\xe7K\xb9\xeej\xb5Z\xa0\xa5\xebU\x9e\xedDh\xee\x90TZ\xaa\x08\xf8k\xe9#Y\xe3S\xf5\x85\xf1\x9f\xc9\x86\xa1\xcfk\x86p\xa0\xb2\xb8I.v\xed\xf3\xb8\xe6d\xdb]b\xb2V\x86\x1f\xb3J\xb8M\x13\x9f\xa7\t\x03\'\xe6\x1c\xeb>}>\xa5\xff\x00\xfar\x02\xac6\x81\x95;\xb8\xbaW\xfaFQ\xc1\xea\xbd\x8e\xa6\xe1\x19\xf3%\xae\xae\x19@\xfc\x90\xe7\xfbk"}\x0fS\xa3y\xfb#\x07B\xb3\xbd\xcfi\xeam\x96V7\x9d\xa1|^\xdfzK|\xc5G\xe7\xc4\x8daj\xb4\xba\xf64\xdb\na\xaf\x88\x8c\x15=\x15\xee\xaa\xb6U\xb4=$\xf0O#\x8f\x8e4)"\x80r\xd8\'\x198\xd7\xc8\xbe/\xe9-\x8d\xaf\xd6H\xe7W\xfd\xa7\xe5\xba\x15`\x8c\x0f\xaf\x95\xaf\xa3\x9bsC\x07)\xa5\xfe\xd1]|\xda\xf2\xd6l\x9e\xa0V\xdb\xa0\xf5~\xcf\xb8.\xb2!\x92\xa6iD`\x82!\x85\x83\x91\xe4g\xb0\xe2Gs\xdc\x1f\x98\xe9\xe5\x8a-C\x7f\x13\x108%\x8d\xec<\xd9"\x85\xe3\xecx\x0bL\x8fm\x0eP\xf4w\x07\xdc\x9d\x1f\x8a\x86\xd9AW{\xb9\xd0I\x9f\xf1U\xde\xd1"\x90\xf0\xc8s3\xc8\xd9+\x12\x87*\x17\x91#\x88\xf2T\x90\xc3\xdb\xf8~\xaaN\x19\x1b\xb3\xb1\xae\x1c\x11\xc0\xedg\xbe\x12\xafa-\xca\x97\xfd%m{\xde\xd1h\xda\xf3M\xbb\xe0\x9a\xc8bq5M\xba/Jx\x1d\x86x\x90\xcc\xc4\xc6\xd8\x03=\xc6q\xf7I\xef\xa3\xf0\xeb\xf42z\xdbXL\x9d\x816*\xfe\xdc\x8c\x1f5\x9e\x12\x13[Z\x91\xedZ:[\xc7Md\xde[\x8f\xad\x15\x92WZ$\x96\xa6\x8e\x1a\xd8czX"F\x91\x18zi\xc5\x9aN%O2\xc3\x88\x0e;\xe7O\xcf+Y\xae\x1ah\xb4\xa0\x07\x96\x83V\x1cN\x0f4@\x17\xf4\xa3\x8bJ\x80\xe7\x15\x15n\xa1\xdd\xdb\x82\x8a\x8a\xf1y\xbaGIOr\x02\xe1$\xadS\xc0!.S\xd5A\x82YcS\xc8F\xfd\x80u$\xebfwh\xa2/dm\xbd\xbe\xc0+\xc0\xe0\x9b\x19$Q#\x92\n+Y\x8c\xa0\x11\xec\xbd8\xb9V\xdd6\xe4"\xa6\xf2\x95.\x9bn\xbe\x9eP\xc2I\xb8`\xb3\xc7\x95(\x18\x9cs\x19\xc8q\x8f:!\x13u\x16\xb5\x928\xb62=\xe2\xa8\xd5\xf0\x0eA\xa1\xdb\xb1\n\x8f\x8fp\xa5\xa0t\xf7}\xd6n+\x05^\xe6\xdc\x95\xc9=\xc2[\xc2\x89,\xae\x00\x8e\xaaN\xdc\xa3d\x7f\x89\xcb\x02<\x90\xa7\'9\x19\xcf\x9e\xd7\xe8Y\xa7\x99\xb1\xc4\x0e\xcd\xb8}\xd9h\xfa\x10;~\xa8\x05\x84-\x1b\xa84\x1b\xd5w6\xdc\xeaD\xbd<JkF\xe4\xaa\x8e\xdb{\x8e\xddq\x8d\x85UkqX\x8dM2\xe5\x06Dl\xa5\xc3\x10A\x05\x86<\xe3id\xd3\xcd\xa2\x96\x0382D\x0b\x9b`\x8a`\x19\xda\xeepM\xd1\x17|e\x12&\xbb\xb2\xbd\xda\x9bKx\xf4\xbfv\xc5k\xa9\xba[(l7\xc5\xa8\xa8\x8a\xa6\xcf\x13\xbc\x96\xf7\xca\x19i\xf0@L\x9elS#\x18\xe5\xdb\xe1\xce\xb0\xf5\x9a\x8d\x1e\xbbL&\x00\xbaF\x96\x82\x0f\x04d4\xe0\xde\x00\xceS\xf1\x07\x01G\xb2\xd2,\xd6\x0b\xc6\xf4\xb6\xd6t\xc2\xe3r\xa5\x9a\xd7\x15Dq\xcbQ\rQ\x84\xce\xa82\x0c\n\xb9d\x97\xc6y0\n\xd9\xcf!\xe7\xce\xc9<z)\x06\xa1\x84\xdeH\x15\xc5\x9eO\x90{VOe\xa2\xc6\x89\x1a,(\xbe\x96\xd8\xb6\xad\x8a\xcdWM\xbc\xebx-E\xb8VU\xad%|\x89$0\x19\x0f\x07\xf5P\xa9,Y\x18aO\xb0\xf9\x81\xad.\xa7&\xad\xd3\x87@\xdb\xa7\x16\x8b\x00\x82k"\x8d\xe3\xef\xfb#5\xd1z[j\x8a\x03t\xf5\x93j\xa2S\xed[S\x1b\xa9\xa6q\xeb\xc1z\xa2p\xa1\x15G\tA\x90\xfcd\xff\x00\x16\x0e{\x9c\xf7\xef\xe9\xfe\x19\xd3\xea:f\xaf\xf1R\xc2\xd3\xbb\x83\x83\xdf\x8a\x02\x87\xed\xf6I\xea\x1c\xc9\x9b\xb4\x15\xe2\xdb\xd4\xdbutJ\xc2\xcfj\xe0|"\xd1"\xe3\xf0\xc0\xce\xbe\xfb\xd2\xf5\x8f\xda\xd2\xe67\xf4\xa5\x8b,"\xea\xd5>\xda\xeaE\x05\x0b\x86\x16\x86\x08|\xfd\x8e\xb9\xd3\x1f\x80<\x87\xf6\xd7\xb4\xd1\xeb\xd9\x7f-}\xad&\xf8H\xe0\xab\xdb\'Rvui\x06{\xb5L-\xee+i\x95\xb1\xff\x002y\xd7\xa3\x87Q\xa7w\xf5%\xde\xd7\x05II\xb8\xb6}Da\xa1\xbe\xd2\x13\x9fi1\x9f\xeb\xdc\x7f}<\x1b\x19\xe0\x85C`#\x92\xfb\xb7c\xef\x15\xe6\x1c\x91\x929\xe7\xbe\xac#\x1eTeFU\xd1V\xd6\xc5\xf1F\x14c\xb6XcZ\'!wu5v\xdb2;\x95v\x01\x87\xde\n3\xa09\x80\xa9\xdc\x91T\xedY\xf9sY\x15\x90{\x91\x8d\x01\xccr\xb3NP\xb3Xj\xc3\x1e$dx\xc0\xd2\xc48\x15e\xc1\xa8\xee\xf4\x871M2\x1cy\x8d\x88\xff\x00]\x05\xedq\x16J\x80\x12\xcb\xbe\xeb\xeaM\x99qE\xba\xeeq\x8cvC_!\x07\xfeRH\xd6N\xa5\xda\xa8\xc5\xb5\xc5\x19\xa5\x87\x04(]\xd5\xd5^\xa6\xd4\xf2\x82\xae\xe0\xb5\x18\x1fzZT$\xfd3\xc4k\xc0\xf5\xf2\xedlF9\x80s~\xc9\xfd9ln\xb6\xae{^\xf1a\xb8_ \x9a\xdd\xb5nU\xd3\xd6\xabS\xcfI\x1c\xc5\x1e)\x1c\x0cJ\xa3\x90Olrb@V=\xb3\xdb_\x02\xea:-F\x98=\x939\xac\xac\xb4\xd61f\x8e/\xc5\xf9+v)Z\xe1\xed\xe7\xba\xe9\xb3\xba\x87\x16\xca\xdc\xd5\xfd7\xb1\xec\xc9)9-Ud\xe2K\xa9\x14\xc8Q\t%\xc3\xb1c\x94\x18\xecI\xe4H\x00\x82p\x19tG]\xa4f\xb1\xf2\xddm\x00l\xceM\np\xfa\x93\x82\xde3b\x95\xde\xd2\xd1\x95?\xb3w\xad\xc7n\xee\xe8.\xf1\xc9\x05\xd6\xa6\xe1E\xeaM\x04\xf3\xaf\xd9\xe9\xe3\x88\xb1\x8e \xad\xe2,\xbe\x01\xc9c\xdc\x9f\x96\x9a\xd4@\xc9\xa0\xda=\x81\x87\x06\x8d\x92pI\xaa\x17\x8f\xa0\x1f{Y\x92\x82\xe7YU\xe3cmM\x9f\xd1\xc4\xba\xdd\xaft\xd7KmmlI{\xa0\x9e\xdf\x14dS\xca\xc5\xbd%\x91O)\x00wQ\x95eb\x84\xe4\x12\x0e\x93:\xf9\xf5}Kd@\xb5\xed\x07a\xbb\xcbk;M\x81\x8e.\xc08\xaaB\xf4\xf6\x84\x97}\xf4\xf3oZd\xba\xee\x1e\x95\xec\xaaJ\xed\x8fSlH\xf7\x0c\xc5\xc5@\xb0\xcb\x1a\x9eR\xc5\x16C\xb0TbH\x8f\xdd<\xf69{E\xae\x9fT\x1a\xddT\x9bu-u\xb0Uz\x81\xd7@\x9a\xdb\x920H\xaa<d\x15v\r\xb9Yv\xe2j:{\xfd\xc3fE\xb8\x12\xbe\x86\xfb\n\x06\xbb\xd4\xd0\x80\x86\x12\xb9\x8cD1\xc5d\xc7%\xe4\x01\x04\xa7?:\xf4\x10\xeft,\xd4ztc\xbfh9\xb1\xcd\x9eH\xefG\xcdg\xbd\xe8^T\x97L\xaf\xdbGmu.\xe1e\x97h\xdd\xcd%t\xe5L\xd5)\x89s\x90\x17<\xdf(\t\xe5\xc5\x83g\xba\x8c\x0f:\xd1\xea\x90\xeau\x1d9\x93\x19ZKG\x03\x83\xe7\x81\xfa\xe3\x1eP\x1c\xc0\xe5se\xeb\xc5\xaa\xd3\xd3\xab\xad\xdf|\xc5t\xbcMAr\x9dmB\x02\xa8i\x9c?\xecB:\xba\xf7\x05pd\xc1l\x16\x039 \xe3\xc9\xd0\x9d/R\x8e-9la\xcdn\xec\x13\xc8\x1b\x89\x14\x7f\xf6\x92\x07~TmsY\xb9l\x96\x1d\xbb\xd5\x8b\xe5\x8fg\xef}\xe7lj\x9b}=b\x9b\x8c\x14\xd7\x10\xb2\xd3\xb3\xc4r\xef\x14j\xaa\xca\xd9<\x88\xef\xdb\xe5\xaf\x19\xa9\x9f\xa6\xc2\xedL08\x03\xc0;M\x1a7@\x93`\x8f\xae\x0fd\xfc-;\x86\xe5u\xd4\xde\xa2\xec\xed\x9do\xb7Q\xec\xdasb\xb9,\xd1\x97AG(\xa7\xab\x85\x98\xb1\x0eO\x1c\x13\xfcA\xf2p\x07q\x9cch4:\x9d[\x9e\xed@\x0fe\x11\xceA\xc7jwb{c\x9ei:\xdd\x8dpi4\x98\xdbvV\xd7\xd8\x95\xab_\xb8\xbd[\xa4W\xb35M5\x84#UTR\xc4Iii\xa2\x8eF"jp\xf2\x02\xa4\x80P\x91\xf2\xce\xa1\xfa\xedgQ`\x10\r\x8e\x8e\x86\xfb\xda\xd2j\x81$\x0fk\x8d\x1b\x19\x0e\xcf\xd9\x16J\x000\x95\x07v\xdeP\\lIAq\xd9u\x17K]=I\x8dh.\x12\xf2\xb8SE\xcd\x82\xb4U\r\x82]\x07\x10\xc8YU\x86A\'\x88\r\xf4\x7f\x84_&\x9b\\\xe8\x9e\x03\xa3\x90sT\xdb\xae@\xe5\xb7\xce/=\x8fd&\x8d\x924\x10h\x8f\xf7+\xfa\xc9\xb3\xf6\xd6\xe3\x87\xed\x1b\x06\xf6$(?il\xbaG\xe8T\xc2~Y \x06\x1f\xcd\x81\xf9\xf9\xd7\xdctz(\xa5\x03\xd3u\x13X\xc7\xf7\xfe\x0e|\xe5b\xcc\xe7\xb4\x90\xec\xfd\x97\xd9\xed\x17{=O\xa1SC-;\x83\xf1,\x8a@?Q\xf3\x1fQ\xad\x88\xf4\xf2F=\xc1.\\\x1c0\x8c\xa4\xb8W\xd3\xb7\x02\xe1\x87\xb3\x03\xed\xad\x08\x9b\x8eU\r\x04\xc6\x8fp\xcc\x9f\x0c\x87\x19\xf7:\xd1\x8c<r\xa8h\xa7v\xcd\xd5\xc4q\xf5\xff\x00\x0e\xf9\xd3m\x95\xca\x85\xb8V4{\xa2I\xd4\x05\xa68>0I\xd6\xf8r\x10i\x08\x87Z\xba\xac\x9fNL\x9f\x19Q\xe3U*\x84Q_\xd1m\xba\x9a\xa0\x0cq6I\xee\xa7\xbe\xa8\xe8\xfc.n\n*\x9f\xa7\x955 ,\xd02\x83\xe4/|\xe8N\x8e\xc6T\xefF\xc5\xd2H$\x8c\x89\x1c\x80=\x98hN\x80\x91\x85;\xca\x06\xeb\xd1\xaa\x19``\x91r\xc0\xef\x95\xce\x92\x97Mb\x81R\x1eVI\xd6]\xad\xb0\xfaq@*\xb7%\xc28\x8c\x991SE\x86\x9ab?\x85s\x9c}N\x00\xf9\xeb\xceu~\x9f\xa4\x8a-\xd2\x1f\xf2\x9b\x81\xd28\xe1b\xf4;\xe7jT\xdd!\xbePOr\xa0\xa9\xa2--\x11\x87\x8a$G\x88\x1c\x9b\xbf&l\xb1\xed\x820<c_\x9d>#\xd3\xf5#\xaaxtm\xd8q\\\xd8\xe7\xb8\xac\x8c\x95\xe9\xb4\xef\x887ot\x07\xfbD\xb8\xdb7}\xb7pn\xcb\xfd\xc6\xf6j\xfb\xdb,\x94\x14q\xc4\x8b4\x84\x01(\nR>~\xde\t\x01\x9b\xeb\xac\xb1\xa1\xf5t\xaf\xd3\xc4\xc6\xc7\xb7\xe6q$\xd8\x1f\xd3d\x13U\xf5\x03\x14\x8a}\xc3r\xa9\xbd\xde\xfasw\xe9\xe4\xdbR\xef\xb2\xe2\xa0\xdc\xf2W\xcbUh4\x10\x94\xaa\x9agb\xbc=H\x80\x0e\xbe\x89\x19\x04\x95\x04\x02G\xc2\x0e\xb3\xa0f\xb5\xba\xafU\x92n\x85\xa0\x07Y\x14\x00\xc94n\xb3\x91B\xc8\xc5\xa1=\x8d-\xcf+\xc0\xd94\xbb\x8e\xa2\xc7e\xdb[\x8a\xb6\x8e{(\x89\xe4\xa1\xba\xcf,\x90H\x92\x0fI\x01\x8c\xb7r\x83\x91.9*\xe3\xea4F\xea\xdd\x13%\x92V\x02\x1e\x0eE\x03c8\xc7\x18\xaa\xef\xc2Y\xcd\xb0\xa6S\xab}W\xdc[\xff\x00y\xf4J\xddiZ-\xc6\x1a4K}\x96\x9d\xa5I\x90\x94\x0c\xef!h\xd2(\xe4\xcarc\xc7\x88c\x825\xae:7M\x83M\xa5\xea\x0fu\xc4\xeb\xf7:\x80\xb3c\x02\x89%\xb9\xaa\xbc\x8b([\xf6\x92\x0f)\x85\xabm\xf5{\xadt\x12.\xda\xda\x16\r\xc3u\xa5\xa5Z\x1a\xbfZ\xb4Q\xbd\x82\xb1ZB\x81$dy=O\xde\xe2\x00\xf8\xfb\x10\x00V"t\xbd/\xa4J\xd6M+\xd8\xc2I\xf9won/\x82\x06\xda\xc17\xc7\x9c\xa9\xb7\x91\x85\x1bi\xdd\xb6+\xa4\xb7\xda\x8f\xf1L\xf4\xd2\xc9N\x94\x15\x95\xb7Kj\x99\x05`FGP\x8c\x15HA\xc4\x84RNT\xf9\xc8:\xd0\x9fM,N\x80\x18\xee\x8d\x80\xd3\x8d\xb6\x08\xe0\x9es\x93C?z\xe6\xdb\x81 \xab{oE:\x7f\xd2\x8d\xedo\xbc\xee\xcb\xe5\x92\xebf\x96\xc3Q\x0c\xb0\xd7\xc5\x14+\xf6\x97t\x89KF_\x94\x8eW\x99\x05T\xb0,\xa7#\xb1\xd6#\xfa\xbe\xbf\xa9\xe8^\xdd3\x1c\xd9\x03\x81\xb0I!\xa2\xcd]\n\xed\x82x\xe0"\xb1\x94\xec\xad\x02\xe3t\xea\x8d?S!\xda;\x0f\xa7\xd5r\xed\xef\xb3\x19)\xa2\xb9\x87\x8d%\x90\x82\xa3\x9c\x92\'%T\xfd\xa6\x11\xfc\x83\x92\xc0\x05#\xcf\xfa=0\xf4\xe3>\xa6P$\';H$\x0f\xb05\x93VF~\x89\xc8X\xefP\x808\x1d\xd1u;\xd7\xa8\xddA\xdc\x14\xbb\x93e\xee\xda*\xfbE\xacIGp\xb6<_\x12U\xc0\x80\xcc\xa6*\x85>\xa69\xaa\x8e\xed\x9f\x87\xc1\xf1Y\xba~\x8f\xa6i\xb6j\x19Ow\xb8;\x9a\x0e\xe2\xc8\xe3\x8e\xc6\x95\xa1\x94\xbaM\xd8-VW[M>\xe0\xbb/S\x16\x9a\x9fqG\x05\x1b-]8\xa62\xcbO"\x07Y\x128\x00#\x89\x00r\x84\xe1\xb9\xa0<\\\x9e\xdd\xd3z\x1fY\xd4A\xf8}<.npG\xcaA"\x89<\x87\x03\xc1\xa3m\'\x8a\xb2W\xeaa-\xf7\xd7\xfb\x8f\xd3\xf9YN\xe3\xb3>\xec\xaa\xa9\xde\x9d\x0c\xddUu\xd1\xc14\x82\xba\xce\xb5\xb2\x1a\x98\x1dX\xf2*\x0e\x1aU\x07\x97$\x7f\xda)\xef\x86\xc9+\xf6O\x86\xba\x0c\xed\xd3\xb7\xf1Qm\x9b\xb88\xba<\x81\xc0\xbf\x03\x1e0)cj\xa5\xd8\xea\x07\xda\xbf\xb6\xee\xe7\xac\xaf\xa7Y\xeba\x02\xa9<\xbf\x1e,\xbf^C\x07^\xf7K\x06\xc3UT\x93\x7f\xb8+\xdd\xbb\xd4\x96jqn\xdc\xb4\x0bQL\xe3\x0cd\x8c7\x7f\x99\x07\xdf\xea;\x8f\xae\xbd>\x93V\xf6\x8d\xaf\xc8J>3\xd9>\x87lm\x9b\xd5\x18\x9a\xc9P\xa8\xac~\x1eG\x92\x0f\xcf\xca\x9f\xa1\xd6\xccqE(\xb6 \x1b\x08:\xfe\x9f\xdc\xe0n\x13 \xc62\xa7\xc8a\xa2\x08\x1c\xd3\x95M\xc5\x03.\xda\xa8\xa7\x1c\xd6\'A\x9e\xfd\xf4v\xb0\x05k\xb5\xa1\xd9n\xfb~$\x0b\x14j\xa3\x1d\xdd\x9b[ChCv\xe5Km\xbbY\xe4\xe2\x80\x07R?\xf0\xfb\xe7\xfah\x84\xb1\xca\xb4Sjj\x9a\x0c\xf2Jw\x18\xf1\xc8\x81\x8f\xeas\xfd\xb5\x05\xb5\xc2\xa7t\xde\x8a\xb9\x0c\\B\x0c\xe7\x00\xf9\xd4\x1ap]XA\xee\x9d\xf3\xb46e?\xad~\xbd,n\xc3+\x02\xfcR?\xfc*2O\xe3\xe3\xeb\xa5\xa5\x9a(\x87\xb8\xab\x06\x92\xb1^\xa6\xfe\x92{\xb6\xf0\xd2[\xf65\x19\xb4\xd2\x91\xc5+*\x91Z\xa1\xbe\xa1\x0eV?\xa7\xde#\xcfmbj\xfa\x8b\xdcKc\x14<\xa3\xb2.\xe5bU\xbb;u\xef\xaa\xb9\xbe\xc1\rE\xc6w\xcf\xdakjY\xdc\x9f\xc5\xceI=\xfd\xb2q\xf8k\xcdO\xa5\xd5j]y?T\xebd\x8e0\x93]:{c\xdaj\xff\x00\xad\xae\xb0\xa9\x04rH\x90K$\xa4y\x0c\x14\xf0@~@\xb1>\xe7:\xf0\xdd{\xa1;S\xedt\x94\x07`,\xfeg\xb2wM\xa9\x02\xf0\xa5\xaf;\xba\xcf_C\x15\x92\xd1\xb0\xe5\x10Z\xa9U(\xeaR\xa8\xab\t\xc1\xc7>@|9\x05\x8e\x17\xe2,Gq\x8c\x8f\x9ck:C\xb4\x1a\x93#\xb5\x16\xe7\x9e(q\xdb\xbdq\xe7\x1c\xad8\xe4\x126\xab\t\xbe\xec\xa0\xeaN\xe4\xda\xf6\xeb\x8cU\xd0\xd3\xdd*d\x8ekz\xc9A\x08ZJvNIQ4\x87\xba\xcc\xc0\x06U\x1d\xb2\xeb\xdf\xb0\xe5\x8f\xa4wM\xd3k\x1c\xd7\x0fcy\xa2\xeb.\xba-\r\x1f\xd28?@T\xbd\xae{i\xab\xbfR-\x9dA\xb9l\n\xee\xa2\xed{\x8dl\xea\xd4\xadOG\xba\xa4\x12\xdb\x1a\x96\x912\x8f/\x1av\xe1\'9A\xc6\x00<\xf8\x00\xaeH \x9d.]\x13u\xed\xd2\xca\xc0\x0f\xccc\x1b^/$|\xc2\xdbM\xc9\xcf\x04\x92@\x19\xae\xcb\x8c\x9f\xd1I\xec\xdd\xbfS\xb7?H\xcb^\xdf\xa1\xdd)\xb7\xeb\xe6\xb2C\xfa\xf6\xa2\xad@\xa9\xbc7\xd9\xcf\xda*"\x89\xa31\xe1\xa6Nh$!\xe4*\\(\xe6Tmu\t\x9b\xac\xf8vI\x8ce\xed\xdcv\x81{Y\x9fh\'p \xed\xc1\xda\x0b[\xf2\xde\x01*\x06\xb88vU\xfd\x05\xa8\xea<}Y\x9ad[\xa5\xa2\x82\xfb_q\xae\xbaW\\\xda\t\xe7\xa8\x82\x99\x87\xa3S\x12\xb1U2:\x97\x8d\x00\xf8?b\xdd\x8a\x0c.O^\xd3\xf4\xb7\xf4\xe65\xcek\xcb=6\x80\xdb\r\x05\xf8p\xc7f\xd6\xe7\x0eh\x8c\xd9\xb2h\xda\xfd\xd5XN\xaa:\xa1f\xdd\xdd \xa4\xda]\\\xda\xf6\xcb%f\xe1\xbeV\xdb\xe77\x1b\x02\x9f\xb2\xc9\x1c\x84\xbdd\xad\xe9\x81\x14\x8b\x0c\x91/\xaa\x030g\x0e\xa8U{(\xee\x97&\x97\xac\xbfS\xa1\x95\xcellk\xa8;\xe6\xb0@k}\xd9\x16,4\xd3{\x17\x03\xcd\x9a\xdd\xc2\x88\xee\xbdu\x0fc\xfe\x8e\x94\x1bn\xcfYx\xdbWY\xa0\xb7\xb4\xfc\xa9\xad\x8d (\x92*\x05\xc9\xc8\xc2\x96\x8e5\xecW\x89 \xae\x03>\x94\xe9\xbdC\xe2\t&\x91\x8c\x91\xa1\xc76\xe02\xe1~3b\xc9\xc8 \xf7\xac+\xec\x8d\xae\x1b\x82evzm\xf7\xd5-\xbb\xd5\x8d\x95\xba.\xf4W)\xe6Jz\xca\xab\xfb\x12\xd7&\x89c\xcc\x92,l\xfcr\x03!V\xed2\xa3wV\x18q\xc4d\xd2\xf4\xb9\xf4\xd35\xafkh\x80\xc0\x00n\xed\xd8\x00\x80Oc`{\t\x16\x08\xc8(cD\xdb\xae\xbb\'[\xda\x9fg\xed.\xaa\xd2\xd6m\xfb\xb5,5\x15\xb7!Q\xb8-\xf4h\xc9\x05=C\xa7\xa5\xf6\x84\x89IT\x90z\xaeIo\x88s|\x1e\xfa\xcf\xd2I\xd45\xbd4\xb2k--\xa6\x1c\x12\xe0\xd3\xed\x0e\xf2\x0f\xfa;\xa9\xd8\xc68\xedA\xee\x1a\x01\xb4\xf7\x84\x97]\xb1WWj\x9c\xb8%\xa9d(\xd2\xc9\x80\x0b\x10\xbeyy \xf6$\x9c\x83\xaf\xa9|-\xd3\xba\x9e\x8a\x06\xbak\x0e\xaf\xdb\x90\x0fl,\xddL\xb1<\x908T\xf6\x1d\xeb\xb6w\r\xc6\n\xce\xa8\xedx\xda\xe0\xa0csX\xc0\xa7\xadS\x8c\x0e|p\xb3\'\x8f\x81\x81Q\xe4(>~\xb9\xa0\x9e9\x99\xb3R\xd1\x8e\x08\x19\x1f\xef\xef\xddf\xc9\xea\x16\xd08\xf0\xae.\x9d\x0c\xdb\xbdK\xa57\xdd\xb3{\x86\xba^\x18\x17*\x1e1Ug\xf8g\x8f\xb0\x90\xff\x007\xc2\xe4v\xc61\x9fJzl:\x86X7\xf5\xef\xf9\xa4\xf7\x96\x1c\xac\xabq\xecM\xdb\xb0.\x06\x97p@\xca\x8c\xe4E2\x03\xc1\xc8\xf6\xef\x82\xa7\xf9H\x07Y\xf3hg\xd3\xba\x88\xb1\xe5\x1cJ\xd7\x05\xf2\xd3y\xb8\xdb\'\x15\xb6\xea\xc9#dl\x90\xa7\xb3}\x08\xf0\x7f\x03\xa2D\xf7\xb0\x85\x06\x9c\x16\x9f\xb0z\xa3m\xaf\x0bh\xdc\x88\x90\xb3vY\t>\x99\x07\xdf\'\xee\x9f\xc7\xb7\xd7[Pj\xb7\xe1\xc9w1^V\xec\xba*\x98\xbdx#\x05Yr\xa4`\x82>z\xd2k\x03\xc2\x16FV\x11d\xdfr\xc2V8\x1d@\xc8\xc8a\x91\xa3\x89p\x8a\xacl{\xedLa\xaa.\xe9\x14~\xeb\xcdT\x7f\x9e\x89\xea6\x94\x14\xe6\x0e\xb0m\x0bnBWM["\x0c\xf1\xa6^_\xd5\x89\x00\x7f^\xda\x1b\xb5\x910d\xa1\xec\x05,\xb9\xf5\xc3~nWk^\xdb\xa2\x14H\xdd\x88\xa6\xfd\xa4\xe0\x7f\xc4F\x17\xf1\x00~:E\xfa\xd9\xe5;X)X1\xa0\xd9Ji\xf6\x8d\xd6\xb2\xac\xd5\xde\xaf\x02\x9b\xd4\xef$\x985\x137\xe3\xdc\x0c\xff\x00\xcf\xa0\x1d4\x87/*\xfb\xbc&\x14\xdbCb\xd2\xca%\xaa\xb2\xd6]\xddpT\xdc*\xcc1g\xe7\xe9\xc3\xdc\x8f\xa1|\x1c\xf7\x1a\x91\x04\x03\xb5\x95\x16\xe5\xf3u\\*j\xed\xff\x00\xab`\x82:jd\x18\x8a\x8a\xdf\x00\x86\x15\xfcUq\x93\xf59:\x04\xd6\xff\x00o\x03\xe8\xb8r\xb1\x8d\xed\xb6\xe5\xab\xb9-\r\x05\xb6Z\x99\xe5<!\x8a5,\xd298\x00\x01\xe4\xf9\xfe\x87\xe4u\xe5u\xfd<\xca\xed\x8c\x17i\xc8\xe4\r\x19N\x93\xa3\xb7M\xb3\xb4d\xaf\xeal\xb0D=\x15\x8e\x0bE\'\xc3\xc0.\x08y\x1dq\xcaC\x8c\x1e>?\x89\xb91\xd7\x94\xd6|\t\xd3\xf4\xa5\xda\xbdM\xbaK&\x89$g\xb1\xbe\xc3\xc0M\x8e\xa3#\xbd\x8d\xe1I\xda\x86\xe7\xdd\r[\xb5\xed64\x9a\x8e\x15Y\x04T\xf4`\xc81\xd9)\xd7\xc7i\x18&r{*\xb7u\x04\x9dx\x7f\xfc\xa3.\xbb\\e\x85\x9f(?k8\x1f\xfe\xf6L\x8dg\xa4\xd0\tJ\xfa\x83\xb2n\x13X,\xf4\xfdC\xea\x92RVZ\xea\x8dEe\x82\xddvdH\xa6\xf5\x8b\x84\x86\x11\x85\x0e\x00\xe2$Q\xcb\xbeI=\x8e\xb0\xe4\x87W\xd0\xfa\x84\xdax\xa0\xb6\x9an\xe2\x06}\xa0\x12\\r@\xf0|`\x0c\xa6#{\x1d\x18q+\x86\xf3\xb0\xdcn[\xd7\xf5\xf6\xcd\xb8\n:\xc3\x1d\x13\xae\xed\xaa\xa0\x12\xd6E]\x1c\xb1\xcd\x1d<j\xa7\x8c\xaa\xa8#FR\xab\xc8\xa1\x0c\x19@,\x8e\x87V\xc84\x81\xb3\r\xc0n\xff\x00\xa6\t\r\xd8ZZK\x8fbrA\xb3W\x8f!\x874<m\xe2\x90[\x86\xefv\xdb\x11\x7f\xb4Yk\xe8\xeb\xb7\xb5\xb4\x04\x82[m\xaed\xa7z\xd9}\t\x08x\xb0!!HB\xc0\xa8\xf0Q8\x86*\x0b\x04pj\xa5:V\xb7n\x95\xf9\xa2\xe0]\xb5\xb6\x05\x1c\xb8]\x9a\xf7\x1a\xbb9\x00\x9a\x00E\x12\xafj\xf7\x05\xf7l\xdd\xf7wT\xfa\x85\xb7V\xf5k\xb9\xd3%m\x9bm\xba\xfd\xa6\x8d\x0cP\xba\xfaqF\xc5\x9a\x17.\xc1\x04\xaa\x03rg\xe4\xc0\x12N3\x19\x0e\xae-.\x83L\xefL\xb4\x90\xe7\xf0\xea\'\x04\xba\xa9\xc2\x81qi\xf06\xf0\x89^\x9d\xbb\xee\xbb\xd8v\xbe\xfa\xbc\xadv\xf0\xa6\xb8U\xde\xef\x1f\xa9$\xa8\xa3\xa6\x82\xea\x05\xbe\x06\x9a\x88\x1a\\BU\x95d^K\x90C\x89\x02\x10\xf9\xc9\x1a\xac\xfa\xad\x042E\xa6{\x03#\xdfD\x91nv\xd7\xd3\xf3\xc9\x07\xe9Uv1J\xf5\xed\xb1\xcd m\x1b\xc6\xf6\xdb?o\xd0u\x0e\xada\xa9\x82\x13nZ\x98 F\x15qK\x1c|ZY1\'\xa0\xd0\xb1\\\xf1\x00\xb6Kg=\x8b\xa7\xa5\x17\xbai\xf4,\xf6\xd9w$msNCE\x8b\xdc8\x06\xc0\xa0\x06\x10L\xc4<\x07!\xf7\xc5\xca\xbe\xc9\xd4\xab\x85=d\xd4\xd5\xb4\xd2$Q\xc8\xf1\x90\xe9+\xfajZ@\xc0\x92\x18\x92Kq>\xe7\xce\x00\xd7\xac\xf8s\xa2A\xaa\xe8\xd1\xbaV\x10I\'8ss\x81\xf9\x0e>\x94\x96\x9aoNR\x01Z}\x82:\x0e\xa4\xed\x18j\xd1\x03V\xd2F"\x98\xb1\xcb\x12\x07f\'\xea\x07\xf5\xd7\xd8\xb4]:-^\x8cm\xe5\xb8X\xcf\x91\xccz\x9d\xb8\xd9\xea-\xd3\x98\xe7\x8c\x82\x87\x04\x1f\x97\xcch\xec\xd0\x98\x8e\x17z\xa5\xc8\xbd\xbb\xb9.\x9bz\xb9j\xed\xf5\x93@\xc0\xe0I\x04\x85[\xfb\x11\xad}!|&\xed\r\xc0=h\xb6\x9e\xb7\xdcn\xb4\x7f\xaa7\\4\xb7([\x00\xc7q\xa4I\x03\x8fl\xe7\xce\xb7c\xd4\xfa\x8c\xa7e.\xe6\x00m\x0f[`\xe9M\xd2v\x95v\x8c\xf6\xe9_\xc3\xdb\xeeN\x13\xf2G\xe6\xa0}\x00\xc6\xact\xfaG\xe4\xb7+\x83\x9e8(A\xd3\xcd\xa0\x98j+\xfd|k\xe7\x84\x90\xc7 \xfc;q\xd47C\x00>\xd2\xa7s\xca\xb2\xe9u\xea\xe5\xb5d\x16:\xcb\xc4w;S\xb6S\x9eRjs\xe0\x95S\x90\xcb\xf4\xe5\xf8cM\xe9\xe2||\x9b\n\x8fir\xfc\xd1\x054\xa0\x86\x91\x0eq\xf7\x89\xed\xa4H)\x80\xef\x08\xfaX\xa2\x0f\x87U\xc0\x00\x9f\x8c\x81\xff\x00\xcf\xfa\xea\x94\xe2h.\xf6\xf2\xaf6\'L.;\x8a$\xb9\xdd\x8bP[\xd8\xe5[\x18y\x07\xf2\xa9\xf0?\x98\xfe@\xe9\x98tFAo\xe1\t\xcf7\x85\xa6[\xad6\xbb-\x1a\xda\xb6\xfd\x02\x08\x87c\x81\xdd\x8f\xcc\x93\xdd\x8f\xe2t\xf8cX\x03Z\x15\t$\xae\xedi\x8c\x1f^\xe1M\x83\x8c\xf0Q\xd8~:\xa1\x8d\xbc\xb9Sw\x85\xc6Z(U\xcb\xad9\x00wPF2?=\x03kn\xd4\x82J\x9c\xdc2\xc9,\x82%E\xe2I\x08\x91yb}\x87\xcc\xe9IF\xe7\x00\xae\x0e\x15f\xcb\xe9\x85\xabd\xd2\xc9\xb8\xee\xb4\xe8\xf7\x89\xa2\xcb\xb9\xf8\xbe\xcc\xbe\xe8\xa7\xc0\xcfnM\xe4\x9e\xde\x07r\x08\x19\xa7aq\xe5T\xb8\x93K9\xea\x855^\xe9\xafZj8\xdeff\x0b\x0c@g\x93\x13\xd8\x0f\xae\xbc\xde\xbe\x17\xea\xe5\xda2\n3]\xb7*\x8a\xc5\xd3\xa8\xfag\xb3\xda\xcfiU7\x1a\xa1\xce\xe1XG\x87#\xba\x8f\xa6;~\x1f\x89\xd3M\xd13A\xa6\xf4c\x14O\'\xea\xab\xbc\xb9\xd6V\x13\xd4~\x9b\xd6\xd3]\xc9\xc34\x82OVi\x9b<\x8b\xe7\xceO\xd7\xbf\xf4\xf9k\xe7\x1dk\xa0F\xf9K\x9c\xdb\xe7\x9b\xef\xcfu\xa5\x06\xa2\x9bI\x16\xf9\xb2U\xcd\xd6\xab\\\\\xa4Ih\xed\xa2\xaa\x9d\xa1\x00(\x9d\xe0be+\xe3\xefw\xf1\x83\x80\x0eq\xaf\x01\xab\xf8nM\x0bd\xd2D-\xa4\x02I\xc9\xa3Go\xdb\x91\xf9\xa7\xe3\xd4z\x84=\xdc\xab\r\xada\xbe\xd7Z\x13\xa8;\x8c7\xd9%\xb9z\xb4\xb4\xd4\x91\x04\x13\xc8X\x89*\xcf\xcd\xb9s\x0b\x8c\x0c\xe4\xfc\x88\x14?\x05ju\x1d\x1d\xda\x8a!\xe7\x0c\x07\xc0\xed\xf4\x06\x80\xfbeL\x9a\xd66`\xd0x\xe5G]l\xb7;N\xf8\x96\xebe\xac\xa8\x8cMqy}\x17\x99\xc0x\xdd\x94\x98]9p*\xc68\xc9\x18$\x95S\x9c\x80t\xcfN\xe8z\xb6\xc1\xe8\xea#\xf9v\x8e0H\x1c\x83\xc9\xe4\x8f\xcc\xa8|\xcd.\xdc\xd2\x9eu\x06\xdfu\xe9\xe5\x86\xd3\xb8v\x14\x93\xd2Z\xaa\xaa\xdc\\i\xa9\xe5d\x0f#\x0eK\x1b\xb2\xf7\xce\x04\x85\t\xce8\xf8\xf8@\xd3z\x8f\x83^5-\x94\x8d\xd1\xb8\x0c\x90\ta\x1d\xb3\xe7\xb7\x9c\x83\xe5@\xd6na\x03\x91\xfb\xad\x0fat\x8e\xcd\xd4\x8e\x91WWY\xa1\x8d\x95n\xed53\xc5\x18\x04!\x89;\x11\xecA\n\x08\xf9\xae5\xee>\x19\xf8b8zN\xd7\x12\\\xd7r~\xcb?U\xa9q\x9b\x1e\x14&\xf0\xd8R\xda\x84KQO\xc6H\xfb\x17\xc7\x9fl\xebvN\x98\xd8c\xaaCd\xa5\xcb\xb7OwU\xc7c\xee\x04\xaf\xa6\xa7\x12"\x8e\x154\xfc\xb0\xb3\xc7\xfd\xf0}\xc1\xf6?N\xdak\xa6\xc8\xed$\xe0\x81\xf7Q3C\xdb\xf5[]v\xda\xdb\xddC\xb0&\xe6\xdb\x0e\'\xa7\x91Ha\xe1\xe2otq\xec\xc3\xe5\xfe\x84\x1dz\x93\x04S\xb3{Ra\xc4\x1a+=\xbem\n\xcb<\xe7\x94/\xc0\x1f\xeb\xa0\x9d/\x80\xad\xb8\xa5\xf1#\xd3\xb7\xc2\x18c\xc8\xc6\xae\xd6Q\xcfe. \xa6\x96\xeb\xbdL$DX\x95\'\xb6[\xc6\x9ci\x03\x85T\xda\x0b\x8c\x88K\xac\xac\xb9\x07\xb6r4f\xda\xe4m-\xd6D\x900\x1d\xc7l\xe7\x03G\x16\x17,\xdaZX\xd1\xb9\x00\xde<y\xfe\xdaP\x8f\nM+\xce\x9b\xf4\xf2\x9e\x9dc\xdc[\x8e\x8b\x93\x1c5-$\x83\xfa;\x0f\xae{\x0f\xcc\xf9\x03M\xc3\x00o\xb8\x85B\xef\x0bG\x83\xedU\xec\xa1\xa1|\x020\xbe\xdai\xc0*\xd8\xe5:\xa7\xa0\xa7\xa3\xe3\xfb\x1f\xda7\x81\xdb\xb6\xaa\xa0\x1b]$\xa0\xa8\xe7\xea\xbc\xa1T~\xeb\ru\xd2\xa1\xc1\xc2M~\xb8F\xd2\xb292.0\xa1W\xef\x1f\xfai\x19\x1e\tW\x0b\xb7N\xb6\xccw+\x99\xdd3\xc2\x044\xe4\xad8#\xef8\xf2\xc0\xfbq\xff\x003\xf4\xef\xd0\xc6\xdb\xf5\n\xe7\x13T\x11=A\xbdMR\x8dm\xa5r#/\xfbF\xf1\x9d!\xad\x91\xce;Z\xa5\xa2\xc2\x07d\xec\x99\xa9*SrVBVWC\xf6\x14\x90v@\x7f\x7f\xeaH\xf0}\x80\xf7$\x11h4\xa21\xbc\xa9q\x16\xab`\xda\x14\xc6\x114\xb14\xaf\xdc\xb1\x90g\xbf\xe1\xab\xba&\xd5\xbb\x95P@Y\xafR\xf6J=sO4 \xe6@\xcc\x06?-ak4\xbe\xb3\xa8\xa2\xb4\xed\x16\xb2\xfa\xbd\x83&\xf9\xeb\xb1\xb5[\xf2\x84\xc9\r\xb5d\x03\xee*S\xaa\xcc\xff\x00\xf2\xb0\x94\xfeGXst\xe6\xebz\xa3b\xaf\xbf\xd8&\x9b\'\xa7\x12\xfd\x05\x7f\xe9%\x046\xda{E\r\'\xa7KIN\x91C\x1f\xb2\xa0\x00\x01\x8f\x9e\x06\xbdl\xfd:744\x0c\x0c%=^\xeb\x1f\xea\xe7I\x7fV\xdc>\xd9M\x01\xe2\xb9`@\xc7\x83\xacmGI\x8d\xa6\xda\x11\x99+\x80AZ\xb6\xdd\x16\xee\xb1\xd5l+\xb4\xcb\x08\xb8A\x8ai\xa5\xfb\x91O\x90cf\xfa\x07\x03?\xca[D\x8bD\x1f\x11\x8c\x8eUw\xd3\xb7\x04\xd3\xf4,\xbf\xae\xd8\xdc\x95\xfd3\xbfD\xf0\xa5\xd5\x03S\xa4\x9d\xbd*\xa8\xb2\xb2FF;3\x03\x9f\xc6#\xf3\xd1\xba0\xf4^\xf8\x1f\xc9\xca\xb6\xa3\xfe\xe0\xaf\xba\xd1\xd2\x813\xad}\xba\x94\x14?yx\xf69\x1f\x86\xb5\xe4\xd2\x83B\x90\x03\x97\xe7}\xc5\xb6\xeal\xb7Y*!\xca\x85\'*W?\x96\xb2d\xd2\x16\xcb\xb8p\x8e\xd9\x01\x14\x9et\xc7\xa8\xb7}\x85v[\x95\x1cm%<\xc3\x15\xb4D\xfc3\'\xb7\xe0\xc3\xd8\xfe^\t\xd3\x1aI]\x03\xbe\x8a\x92S\x96\xe1Sk\xdb\xfb\xd6\xcd\x1d\xfe\xc9(\x9a\x9a\xa9y+\xaf\x959\xc1R=\x889\x04}5\xe8X\xc6H\xcd\xcd(\x1b\x8b]K<\xdd{"\xa2\xd8E\\D\x85\xce9\xe3\xb6\x0f\xcfCtde\\8\x15:\xf4F\'hf8u\xee\x06<\x8f\xa6\x86\x1aU\x91t\'\x89\n\x13 \x8e\xe0\xeamr1\x92\xa2\x0f\x8d\xd4\xf1a\x95\xd3\x15k\x90[\x17i\xc7q\xae[\x95t%\xe9\xe19Tc\xd9\xdf\xd8\x1f\x98\xcfs\xf8\x0f\xae\xa6({\x95\x04\xd0Z]\xb2\x8e\xa6\xad\x879\xc6OuP\xbar\x8a\xa1\xe1SZ\xad\xd5\x14\xd8S0,\x008\x03\xc6\xb8\x144\xd2*9=~r\xce\x80\x81\x92\xd8\x07\xf2\xd5r\xb9\x01}\xb8U+}\x9e9c\x1c\x8eO/\'\xeb\xa5\xa4\xde\xe3JG*`\x8a\xcb\xbd\xd5m\xd1L\xa6Y\x9f\x87.>>\xbf\x80\x19?\x96\x96\r\xdeU\x89\xa5_p\xb8RX\xadil\xa1!R(\xf8\xc6\xa0{|\xcf\xe3\xfez\xbc\xcf\rm\x05\rh*b\xcdC6\xe2\xbe\xac\x15NE4x\x92r;\xfc9\xf1\xf8\x93\xdbY\xb1D\xe9\xe6\r<\x0c\x95w\xbbhZ\x8d\xb2\xdae\xe0\xd1\xc6\x04\x8c>\x00Gd\x1f\xf6\xd6\xab\xc6\xe0)\x04e;\x9a\xd1\x05=\xb8D0\x02.ZC\xef\x8f\'U\x91\x8dcB\x91\x92\xb2\xed\xe9\x14\x15W\x99**\xa4\xc4\x0b\x99e }\xd8\x91r\xc7\xff\x00Ho\xeb\xac\xd7\xb0\x97\xd9E\x1cR\x94\xfd\x19\xb6\xb1\xbcuy\xef\xb5\x11\x7f\xb8\xa6\x9a\xa5\xf2\xbe$\x91\x80\x1f\xd43\xff\x00]!\xd1\xa1\xf5:\x83\xe6#\x8b\xfd\xd5\xe6?\xf4\xe9o\xd7\xab<f"\x92/\x85\xcf\xc3\xafJ\xe8\x9aE\xa5\xc15J\x1b\xa8\xbbU/\x16\xc7\x94\xd3\x8fV68Q\xfb\xc9\xa5_\x08\'*\xe1\xd4\xb0\x8d\xc5m\xa9\xb1]\x8dW\x0c"\xb0\nq\xe7\xe9\xa4\x1d\x1b\x98\xf2{"\x03iwR kv\xe4\xb5\xf5Ok4\x94\xd2\xd7?\xa93\xa8\xca\xc3p\x87\x1c\x8f\xd0H\xb8\x93\x1e\xe4\xc9\xf2\xec\rLF9\x9b;Q#;\x98ZW\xe9\xcd\x93\xb9v\xff\x00W\xf6%=\xee\x87\x83\x19\xa3\xe3Q\x0f,\xb4\x13\x0f\xbf\x19\xfc\x0fo\xa8 \xfb\xebu\x85\x93\xc6\x1c;\xa5\x8d\xb1d\x9dS\xe9d\x91\xc9Y\x08\xa7\x0cyeX/p}\x8e\x81,"\x8e\x15\x9a\xe2\x167z\xda\xd5\xb6j\xb5u\x84\x80\xa3\x0c\xa4v\xd2o\x83i\xc2\xb86\xa8\xbaQ\xd4\xda\xdd\x81t\xf4+\x11\xa6\xb6U8\x15\xb4\xe3\xca\xfbz\x8b\xe3\x0c\x07\xf5\x1f\x91\x06\xd3J\xe8_G\x85\x0ehr\xd8o1Z\xeb\xedks\xb7\xb2TQ\xd5F\x1e9\x17\xba\xb0:\xd7\x14\xe6\xdfd&\x9d\xa5An=\xafE*5M\x1ca\xe3+\xf1*\x9f\x8a3\xff\x00M\x05\xf1\x8a\xb4@\xebSS\xd1\xcbn\x94:\x06x\xdb\xdc\x0f\xbas\xef\xa0\x96\x00\xae\x99[\xaa)\xab \xe2\xc9\x8e\xdd\xf2upmr\xa4\xb1RE\x1d<p\xd2\xc2\xaa\x91\x8c"\x91\xe3\xfe\xfau\x08\xb9S[\x98FR8Uy\x11\xf18\xec\x06\xadb\x94\x13\x84\xda\x9aaLY\x9a\xaf\x0b\xe4\xf1\xd5K\x8d*\xafS\xd5H\xe8\t\x19\'\xc9-\xf7F\x84I\x05r\x9b\xbd\xd4F\xb5M\xff\x00\xddq\x0b\xe4\xe7\xcf\xd0ii\x1cl\x8bV\x01x\xda\xac\x94\xb5\x12\xde\'\x94\x82\xb1\x94\x89\x0f\xee\x8f\xdeo\xf4\xfe\xba\xab=\x82\xca\x92-\x7f\\\xee\xd5W\xcb\x98\xa7\xa3No6#\x85\x17\xc0\xf9\xfeZX\x87K&\xd0\xac\xda\n\xff\x00dmZ[l\nIi\x18\x00]\xbf\x8d\xbd\xc9\xff\x00!\xad\x16\xc6\x18)\t\xd6\xe2\xaf\xacpG\xe9\x87\x8e<\x05\x1d\xf2;\x9f\x9e\xadM\xac(\x02\x97\xdd\xd5 \xa7\xb2<|\xc02)\x1f\x964\x19\x9b\xecR\xd5\x8a\xf5)\x9b\xf5\x1dHi;\xd4\xbaS\x0fb\xc0\xb7&\x19\xfa\xaa0?\xf1k7Tv\xc7\x84V\xd1T?\xa2\xcd\xa9\r-\xde\xf6\xa9\x87z\x98\xe0F\xfeU\x04\xff\x00\xa8:/I\x8e\xa2s\xc0\xe5V^\xcbR\xbc\x18\x1c\x88\xcb\x1e\\>\xf7\xfakY\xcc4\x84AKo4\xd4\xf5\x10(hG&\xc2\x82=\x86;\x7f}\x0c\xb0\x13\x95\xc0\x95\x8f\xf5\x8b`\xacN%0\xf1S\x19!\x80\xfd\xef\x9e\x83,vp\x88\xc7W+7\xa3\xa2\xfdcGY\xb3\xae2,q\xd6\xf6\x8eIG\xc3\x1c\xeb\x9fM\xcf\xc8\x02H8\xfd\xd6m*\xf8\xf7\xb4\xb5\xc8\x80\xe3\x08\x9f\xd1\x9f\xa8U=;\xea\n\xed\xfb\xb4\xbe\x95\x05\xd2aM[\x0c\xbf\xf83\x83\xc5_\xe9\xdf*~y\x1f!\xa5\xba|\x8e\x86M\x8eV\x95\xa0\xb7\x0b\xf4v\xfc\xdb\x02\xe3F\xd5T\xf0\xf3n8\x90/\x96\x1a\xdc-\xb0\x97X\xee\xf6\xd9\xf4\xb3\xfa\x7fh\xa1r\xdc\x8a\xbbc\xfb\xff\x00\xf3\xe5\xa1I\x10*AY\xb6\xe8\xe9\x95E\xbeg\x9e\xdf\xc9\x979\t\xee\x06\x95|\x07\xb2\xbb]\xd9u\xe9\xc7R.;\n\xaaM\xb7\xb8\x92I-\x93\xbf\xc6\xa5r`o\xe3_\x98\xf9\x8f\xcf\xe7\x92A)\x84\xedr\x976\xc6\x15U\xeeh\xa3\x8c\\m5I,\x12!hg\x8d\xb2\x18\x7f\xae\x9a\x94\x02\xdbb\xa0\x14\xa7\xeb*\xe8\xeb\xe3\xf8\xc0\x8aU\xf0\xe3\xee\x9f\xc4h-%\xe3<\xa3!\xd23\x04\xd9\x91\xb8\x86\xf0\xe9\xe0\xea\xd5K\x95\r\xaa\xe3\x02 \x8a3\xdf\x1e\xdet\xc06\x86k\xba\xa2\x82\xeb\x14H\x8948\xe0\x07`<\x92}\xf5\xd6\x17R\xe9\rx\x9c\x12X\xe4\x9e\xdd\xbb\r\r\xc4\xae,^\xeb\xab\xe1\xa5\xa3\xcaLr\xe7\xb0\'\xb9\xd5O\n6\x14\x9e`\xb1\xd4}\xa6i\x14\xc8\xc3\xb0S\x9c\r\x04\xb7\xb9R\x86\xb9\xde\xa3\xa5\x02\x96)\x0f\xa8\xc326|h\x12>\xf0\xae8U]-\xdb\xcfTM\xdeua\xeb\x0e0\x86\xfd\xd4\xf7?\xf3\x1f\xec;y\xd3ZXv\x8d\xc5\r\xf4\xb5KU%<l W\xceW\xf7}\xb4\xd3\x9bd\xaa*+t\x91\xc6\xa2$<\x7f\x84\x01\xe7U\xa0\x02\xe57\xbe.q\x8a|\x89\x08\xe2H\xe3\xa0J\xdb\x16\xb8wY\x07P*L\xcd\x04,\xfd\xa3\r&\x01\xf2\xc7\n?\xa6\x0e\xb2uc\xda\x02#\x02\xd0\xff\x00F\xf5h6\x1a\xcc\xa7\xbdM|\xce@\xfeW\xe0?\xf6kW\xa703N(*\xc9\x92\xac\xaf\x15\x08\xb3\x16\x85\xc1*\x87\xd4R}\xb3\xe7N<9\xd9\xec\xab\xd9z\x824\xa9\xb7\x02[\'\xe1\xc1o}V\x83\x85\x85\xc9F\xfa\xb3%U\xbd\xe1\xaa\x84\xb2H\xb8\x07\xf8O\xcbU\xa0\x1b\x95\xcb\x04\xdd\xfbzKMa\x88\xfcj\x18\xb4n\x0fr\x0f\xfd\xf4\xbb\x99f\xd5\x9b\xc2\x85\xeaE\n\xd3\xee\x1f\xb6F\n}\xb6\x15\x9f\x9eq\xc5\xf0C\x1f\xcd\x87/\xff\x00\xddfj\xd9\xb2P\xe4f\x9e\xcb\xf5WF\xb7\xac\x1dD\xe9\x95\r\xce\xa2`\xd3\xa4\x02\x1a\xc0?\xf3\x14`\xff\x00]l\xe9\xde%\x88\x14\x17\x82\n_\xbb\xacI\x0b5<\xa0\x15\xf59F\xe0{|\xb4B+\x95U3-\xa2\x96\xa2c\x15D*\xc5\xb3\x96\xe3\xe7U-\x04\xae\xaaH\xf7\x0fI,\x97\xe8\x8a\xfaA]\xfe\xe3\x01\xdf8\xf1\xaa~\x19\x85\xc4\xa9\xdeB\x89\x9b\xa7W\xfd\xac\xcd\x05\x15\xd1\x96\x02\xe7\x9c\x12/%\xcf\xe1\xec\x7f\r@\x8d\xcc\n\xfb\x85$W\xebU\xfa\xda}sN\xae\xb9\xc24M\xdb\xf0\xef\xa1\xbe\xd9\x93\xc2\xb5\xda\x02\x92\xff\x00:?\xd9\xea\xa21\x95\xf3\x1b\xae\x0f\xf7\xd46Pp\xa7iN\xedW\xd8\xa9\xd5cG\x06B{\x93\xed\xa2\xd9\\E\xa76\xeb\x83LH\x91\xb9r?x\x9f:\x9bR\x9a\xa5J\xfa^\x9cq\xa9|\xe7\x03\xdbR2\xb9r\xaa\xac\xf4\x81\xe5\x97\x91\x88R\xdf!\xe7T"\x94^R\x1f\xf1e\x15MmD\xb4\xf2\x07Jf\xe0\xd2\x03\xd8\xbf\xb8\x1f\x87o\xeb\xa5\xcb\xc1\x18P\x01\x05q\xdb\xabS\xbb7\x146\xc4r}g\xe73\x01\xf7#\x1eO\xf9\x0f\xcchq\xb3\xd4\x92\x978\xaf\xd0\x1br\x92\x9a\xdfL\xb1\xaa\x04P\xb8A\xf2\x03\xc0\xd6\xb0hhA\xb2J\xa5\xb4\xf6\xfd\xa6\x02\xe5F9j\xbd\xc9\\\x9a%G\x15\x12#v\xf0X\xff\x00\xa6\xa0\n\xe5w\x06\xd4N\xf9\xaa\x03\x9b\x13\xdf\x90\xed\x9e\xda\x0b\x85\x85\xdc\x9c,\xafy\xdc\x04\x93\xcc\xeb\x8e#\xe0S\xff\x00\x08\xef\x8f\xcc\x9dfL\xd0\xf3\x94v\xf0\xb4\xae\x80\xdc\x10l+||\xc6G\xacH\x07\xc9\xf5\x9f\xce\xb54x\x85\xa8o\xe5S_\xab\xb8\xc3%Z\x81\x9e\x04v\xf2;\xe9\x87\xe0PTL\xec5\x11Kic\xcb<\xb8\xb0\\\xfb\xea\x1a\r\xd0\\\x8f\xbaBe\xa1ji\xfb\xab\x1c\x81\xf2\x18\xd5\x88i\xe5A ,k\xa96a\x0c\xcf\xfb,\xc6X\x8c\x81\xf7\x0fb?\xcf@"\x95\xc2\xc9\xfa\xbbI\x14\x96KE\xd2%\xc1Ie\x82P\x07s\xe0\x8f\xff\x00\xadg\xeb\xda=0Q\x19v\xad\x7fC-\xe7\xf6;\xdd~\xc8\xa8\x94\xfau0}\xa2\x14?\xc4\xb8\r\xfd\x8e\xaf\xd3\xdeKv\x95\xd2\x0b[~\xe6\xb7\xcbYI$\x10ad\x1f\x14LG\x93\xed\xadB, \xa8)\xeaXL\x1ad\xe0\xdfvB\x0f`~z\x15VT\x9c\x84\xce\x86!Q\x10\x8e\xa5\x17\x98\x19R\xbe\x18|\xf4V\xb8\x1c\xa8 \x84\xbbs\xed\xc8\xebi\x9au\x001\x18l|\xfd\x8e\xaeE\x85\xd7Ef{\x92\xd8i\x0c\x94u1\xfc\x0e\x08a\xf2?O\xect\xb4\x8d\x04R 9Q\xd5\x14\x10\xd5\x03KV\x80I\x19\xc2\xbe<\xeb5\xed\xda\xf2\x028 \xa4\xb6Z\x96\xca\xbc\xcb\x9c`\x81\xf5\xd3m\xca\xadeU\xdb\xab&d\x19u@N\x00\x03\xbe\x8a\x14#\xab\xaft6\x8a/\xb6\xdcj\x92\x08\xbc/.\xe5\xcf\xc8\x01\xdc\x9f:\xe9\x1e\xd8\xdbevO\x0b=\xde\x9dR\xb9]\xd1\xa8\xad\x10\xb55;\x02\x19\xf3\xfbI\x07\xd4\x8e\xca5\x95>\xa8\xba\xc3xElu\x92\x87\xb5V\x1a;\x0c4jH\xc8\xe6\xf8\xf7\'?\xe9\xdb\\\xcc2\x95\\\x05\xadc\xf4w\xb3\x9a\x8az\xad\xc7R\xa1\x9aYV\x18\x7f\x95W\xbb\x7fS\xfeZ\xd0\xd26\x9b\xb9\t\xcbd\xa5\x99\x93\x86;\x91\x9f#M\xb8\xd9B\xc8*\x82\x82R%Y\x193\x95\xf7\xf1\xaa\xf7\\\x02\xed,\xcf\r+&rP\xe7S\x9a\\E\x15\x01\xbe\xaa\xe4Y\xbfh\xc7\xc9r?\x01\xe3K\xc8}\xa5p\x19\xa5\x98n\xf9\x99\xa0RPd\xfd\xedf\x91\x94n\x15\xaf\xe8\xdd|\x91\xf6e4R\x90G\xda*\x11O\x9f\x12\xb1\x1f\xe7\xad=\x11\xb8P\xde\r\xab]\xc7s\x968\xa5\xf1\xc3\xd3n\xe0\xf8#L\xb9\xd4\x15Ch\xa7\x1b*\xbf\xd5\xb6\xa2\x93\x96)\xf0\xb0?\x8f\xfd5\xcd4)A$\xaa\xb9\x0f\xabj!s\xdf\xbb\x1f|\xea\xc4\xd9QV\xb3>\xa4\xd2\xf2\xa5\x92\xa2\x13\x89\x08\x1f\x83}?\xb6\xa8\xe1aXr\xb1~\xa9*\xc9\xb4\xde\x13\xd8-lr\'\xcd~\x17S\xff\x00\xb8i\x1d[wEH\xcc\xe5M\xf4ov\x7f\x84:\x95k\xbe\xcc\n\xc2\x95B*\x86\x1f\xc0\xc0\xa9\xcf\xe1\xc8\x1f\xcbHi\x1fR\xab\xbc\x12\xda_\xaf\xee\x15\x02h\xd6h\x9f\xb8\xc1Q\x9e\xcc5\xe8\x87\xca\x95\xa3k;\xdf\xf0\xc9n\x90\xdd\xe9\xa4\xfd\x8c\x84-Dg\xf7O\xb3\r\r\xea@\xf2\xbemK\xf7:\x81H\xee\x0eFc,|\xfd5\xcc"\x94\xd1T\xf5\t\x05M)`0\x1f\xb1P<\x1d\x15\xb9*\x99\xb5\x9d\xf5\'o\xa8\xa7\x92A\x85(\x98,\x07\xf7\xd5^7\xe1\\,~\xe1UUOXj\x90\x02\xb8\xe3"\x9f\x98\xf7\xd6d\xe0nFk\xb0\xbf\xff\xd9'>,
<tf.Tensor: shape=(), dtype=string, numpy=b'daisy'>)]
rdd5_partitions.take(1)
#we retrieve one item from the rdd
[(<tf.Tensor: shape=(), dtype=string, numpy=b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x01,\x01,\x00\x00\xff\xdb\x00C\x00\x02\x01\x01\x01\x01\x01\x02\x01\x01\x01\x02\x02\x02\x02\x02\x04\x03\x02\x02\x02\x02\x05\x04\x04\x03\x04\x06\x05\x06\x06\x06\x05\x06\x06\x06\x07\t\x08\x06\x07\t\x07\x06\x06\x08\x0b\x08\t\n\n\n\n\n\x06\x08\x0b\x0c\x0b\n\x0c\t\n\n\n\xff\xdb\x00C\x01\x02\x02\x02\x02\x02\x02\x05\x03\x03\x05\n\x07\x06\x07\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\xff\xc0\x00\x11\x08\x00\xc0\x00\xc0\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1d\x00\x00\x02\x03\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x07\x04\x05\x08\x03\x02\t\x00\x01\xff\xc4\x00?\x10\x00\x01\x03\x03\x04\x01\x02\x04\x04\x04\x04\x04\x06\x03\x01\x00\x01\x02\x03\x04\x05\x06\x11\x00\x07\x12!1\x13A\x08\x14"Q\x152aq#B\x81\x91\t\x16\x17\xa13Rb\xb1$C\xc1\xd1\xe1\xf0c\x82\x92\xf1\xff\xc4\x00\x1c\x01\x00\x03\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x03\x04\x01\x05\x00\x06\x07\x08\xff\xc4\x005\x11\x00\x02\x02\x02\x02\x01\x03\x03\x02\x04\x05\x03\x05\x00\x00\x00\x01\x02\x00\x11\x03!\x121\x04\x13"A\x05Qa\x062\x14q\x81\xa1\x07\x15#\x91\xb1B\xd1\xf0\x16Rb\xc1\xe1\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xc4\xd6tx\x94zz\x12\xc9\x01i\x18#\x1a\x8e\xa5\x80\xfd\xa1SS\x90\xe4C!n`\xe3\xc0:\xd1\xa3<KT\x06\xbdj(2\x04\xa6\x15\xf4\xa4x_\xbe\x99q\x0c\xcf\xf7\x96\x1bmz\xc7\x84\xf9i$##\'\xf5\xd2\xc87\r\x18\x85\xdcg\xb5\x0e\x85s\xc1\x0f\xb6\x11\xea\x9f\x1fc\xfak*\xd8\xc2\x15U(\'X0\xe1JS\xec\xb5\xc3\x99\xf0\x0e\xb3\x8f\x1d\xcc\xa0\x0c\x1d\xbc\xe8\xaf>\xd0a\x97I \xe3\xcep5\x13\xe4\x05\xa5\x00X\x81\x91,\xba\xb5\x12\xaf\xf8\x99_!\xc8\x103\xa7cF;\x93\x91F\x17T\xef\xf6\x15E0\x96rR0H\xd3\xcb\x18\xb7\xda\xd9\x8a\xfb\x8aC\x95\x07V\xf4\x18\xeaP\xcf\xbau\xe5m\xc5\x8dJ8T\xf9oJ\xe2\xeb\x04w\xd8#L\x04\x98U\xcau\xba,vfC\x0bq\xb4\xe4\x82{N\x9e)\x86\xe08\xa8\xb8sm\x9an_#\x9e$\xe4u\xad\x18\x17\xb9\x97&&\xd3\x93\x00\xf2c\xfac\xce\x94\xeaW\xa9\xed\x9e\xe5\xa2QVDL6\xb5t<gS\x93\x90\x9a\x9b\xca\x0cT\xd1\\\x93#\xd2\x01\xc5e^F\x83&<\x84B\r;5j\\s\xe2\x96V\tI\xef\x07\xc8\xd4m\xeb\x03BQ\xc9O\xcc\xa5\xa8\xd8Si\x8er[d\xfb\xe7\x18\xd3\x107fx\x15\x12e\x10\xbc\x15\xe8%J\xca|\x8dR\xa4\x89\xed4\xbbr\n\x14\x80\x0bd\x93\xe7Vb\xc9K\xb99\x1b\x9e\x1d\xa1\xc7P\x07\x81\xc7\xeb\xa6\x97R*\x0b,\xe7\x16\x88R\xa5\xf0\xc2G\x9c\x8d!\xac\x18B\x80\x95\x15\xaaL\xc0\xe6}E\x11\x9e\x80\xd1\x077\x04\x80L\xb4\xb5Yu\x84\x10\xee{\xf0s\xde\x98\xb9E\xd4\x12\xa2j\x9b\xe7o7Si\xe5*\x16\xe6m\xed^\x82\xea|\x1a\x84%\xa1*\xfbaX\xe2\x7f\xa1\xd7\xb2\xe0t\xddM\xc5\x9dX\xf7)\x99\xbe\xdan\x12\x90\xbe\xcaGY\xd4\xbb\x95\x83b/\xef+\xbaT\xb9\xbfC\x85(\xf7\t\xd6\xad\xdcSlT\xa3\x81}\xbf\x02JX\x8e\xea\xd2\xa1\xeeU\xa7q\xb8\x17f2\xecM\xd8\x9d\x01i*\x92Jx\xf6\t\xf7\xd6\xae0^\x15\x92!T\xfd\xecS\xd1\xc9q\xc0\x07\xb6O\x8dfLt\xba\x82\x18\x83\xb8\'R\xdeDFyn!\xd0\xbc\xfbc:\xe2\xbf\x8e\xe7-\xcb1\xe4Z\xdc\xe9R\xde\x16\'A\n\x08NH\x19\x1c|\xea\xc5u@\x14\xc4\xb5\x93\xa83K\xb8\x8d^\xa8\xa6\xd4\xac\xa5\xd3\x82\x07\x81\xa7/\x16\x11#\x91\x8e;#l\xe8uZ`\x0bJA(\xc9\xcf\xbe\x8dB\x03\x0c\xa3\x15\xeaR_\x96m"\x8d(\xb1\x0c#\xd4\x1de>\xda\xf1+z\x82\x15\x84\n\xb9\xf8\xc7\x80\xa5\x82\x14\xb0\x9ccLSBi\x1a\xdc\t\x8a\xd2\xe5\xbc\x12\x96\xfe\xa2}\xcf\x8d;\x96\xf5\x17[\xb9b\xfd\x1b\xd1\tuH\xe4}\xd3\x9d7\x88n\xe6\x13S\xf2\xa2\xc5y\x03-\x80}\xf4C\x16 z\x8a7%B\xb7)\xf2@Qd\x1c\x1f cN\\8\xcf\xc4\x02\xe4Kx\xf4JS,\x1e-\xa7\xa1\xdfZNO\x0f\x1c5\xcaz\x837u\r\x89@\xfc\xb3`\xf7\xec4\xa3\xe3\xe3\x02412\x82\x9db<\x97\x14\xf8\x8f\xef\xed\xa9\x8e!\xca\x10b5,\x17o6\xd8\r\xfag8\xec\xe9\x9e\x9d\rL\xbb2,\xeaL\x96\x93\xe9\xa1\xb3\x8d\x07\x07"\x11 \x89\x15\x9aS\xe0\x1ec\xf6\xd3B\xdfp>g\xef\x90J\xdf\x01\xc6@\x1fr5\xe3\x8fSgsBe)\xcbm\x01\x93\xfc\xbaO\x03s\xd3r|6|en\xc4\x8a\xc4\xfd\x9c\xdf\xd5Tk\x8d&\xddU*\x9fnLy\xb7XR\xd9YJR\x1bq<\x14\xae\x94\x80\x02{\x04}D\x01\x8f\xa4\x0eXq}\xce;\xa8S\xec5\x16\xbf\x12\xdf\x0e\x9f\x87Y,|@\xed]\xb6\xf4+rt\x97\x99\xa8\xd19-\xc5R\x9do\x19_"?\xe0\x9eX\x19$\xa0\x8c\x12A\x18\xe5y~\x11J\xc8\x9d\x19\xd0\xf1<\xd0\xfe\xc6\xeef\xfa\x81C\xee\x92\xa5g\xaf\x03\xef\xa8Qu\xb9[\x13)\xa4P\x9d\x12~a\xa2|\xf6\t\xd3\x0e\x96\xe0\x8e\xe5\xc5\x1do\xc7h`\x9c\xfe\xba\xf2\x9b7\x08\x89s\xcdr\x1b\x19\xf3\xa7\r\xea\x01\xeeP\xd6\xdbT\'\xcb\xaaWY\xecj\x1f!H\x06\xa1\xa1\xa3+\x95s4\xa4\x16P\xe6T\x0e\x02s\xae\x0ef\xc9\xce\xa5\x01,\\%\xdb\xf8\x13W%/\xa0\x13\xf5\xe4k\xa9\xe3\x93\xc2\x02\xacz\xd3\xaez\x85\n\x81\xeb)\xa2\x92\x11\x80@\xd3\xfa\x17\t\x8d\x08\xb2\xa8n-j\xb3^y\x05\xc0\xa4\xf2\xef\x97\x9d \x13\xceyT\xd4\x89r\xdc\x8c|\x88`\'\xeb\xf2\xac\x9dV\r\x08\'pf-a1d\x17PR\x00\xfd25\xe0\xc6\x00\x12\xd5\xaa\xf32\x9b\xedI#>\xfazd\xad\xdcS\x89\x1a\xb3YD \x16\xdar\x9cx\x1eF\x9d\xccT\x1e3\x8d2\xedq\xc2P\x140;\xec\xeb\xc33,\xf1E=\xc9S\xee\x99\r3\xf4\xa3\xdb\xb1\xa6\x1c\xacD\xce\n%O\xf9\xca;\x8b\xfe\'X=\x81\xa5\xb3\\5\x1a\x96\xf0n\xcat\x96\xf0\xcb\xa9\n\xf7\x1a\xcd\x11<z\x9d\x971\xa7\xc1R|\x9fmo\x19\x82\xbe\').\xb3\xe8\xe5*\n\xc7\xb1\xd0\xa5\x83\xb9\xe6\xeax\xa6!2\xdcPS\x03\t\x1d\xf5\xa6\x8a\x8a\xf7N\x15\xe6#\xc3W\xa8\xca\x0eG\xeb\xacj\x8c[\xa9\x05\x15\x86\xc2Ch\x18Q\xf04\x9e"i\x17>\x8e\xef\xac[\x12\xbfrSib\x89\x0e\x1d\xd1&\xa2\xdc\x98wJ\x87\xcb\xb9\x12\xacP\x87\x15\x15\xe5\xad\x03-\xbaT\xa2\x82J\x87\xa8\x87FRx\x83\xf4/\xc7\x98\x9cE\xbe;\x84v\xadnbnH[[\xb8\x97\x9c\xf5"\xe6Z\xbf\x1a\x83!\r5Or\x7f\x13\xea6\xa4%\x1e\x08\xe1\x83\xfc\xc1@\xfd\xf5\xe0A<L\x1an\xd7\xe2c\x0f\x8f\x8f\x83\x9a\xdf\xc2^\xea\x08\xf0\x18S\xd6\xe5`\xadT\x89\xa9\x19m.\xa4%N\xc6\xe5\xf7@ZH\xfb\xa1i>\xc7\\?3\x03x\xd9,tg_\xc5\xce3\xa5\x1e\xe2>\x0b\xa9x\x84\xbc0\xaf\x07\xbd)h\xac|\x9e\x88\r\x95sk\xa0GD\xf9\xd7\x95a\x9dN\xe9p28$\xe4\xfd\xb4_\xb4\xd9\x8b\xbb2\xa2\xe5eS\xe2)\x08\xc7,\x1f\x1a\x0c\x80:\xcd\x82\xb6\xd5\xa9:]p\xfa\x84p\xe5\x8c\xeb\x98\xf8\x01}\xc6+\x19\xa5v\x9bk\xa1\xc7a\x992;\xce0\t\xd3W\x1a\xafQ\xbc\x88\x1a\x87\x9b\x85\x06\x89N\xb7\x94\xd7\xd1\xc9(\xfc\xbai\x00,[\x96&\xa6t}\xc6\x99\xa8K\x9a\xcb^\x14p1\xa8\xf9\x0eR\x81j\x9dAZ\xfd\xc2\xe4\x99>\x8a\x10R\xacw\xde\x9fb(\xf5r\xa6T\x97\xdb!)ec#\xbc\x1dh\xd4\xf4\x99E\x92\xef\xa9\x85\x12\x07\xdb\'M\x02\xe2\x98T\xbaT\x17j\x0c\x94\xa8c#\xae\xf4\xe5\x107\xf6\x95\x13)\x93!9\xea\xc6\xe40{\xef\xadk\x03=&\xc1jMI\xb3\xc8\x94\x8f\xd7D\xbe\xee\xe7\x8e\xcc\x83X\xa3\x88\xa8/+\xc6<\xeb\x1e\x95n{\xa9UM\x9a\xda%\x80\x87}\xfb\x1aZ\xe5\x9a@\x8c\x0bw\xe5\xdfBB\xd5\x9eC\x00j\x95<\x84\x10\x00\x96\xaf\xdb\xd1U\x1b\x93*\xc7~s\xd6\x9aq\x83\x16Z\xe5L\xde\x14\x91\x96\xde\xc6\x06\x15\xa9\\\x950\xc0\x15(\xea5G\xea\x8a[M\xac~\x84\xeb\xcb\x92\xe6\x9d\t\x1a\x99\nw>\x0fq=\xf9\xd3j\xe0\xf2\xae\xe7\xd6\xdf\x8c=\x9f\xbc\xae;N\xe5\x85\x1a\xa8\x16\xcb\tem\xc8v*\x9dv\x01S\x8f\xc8fG \x06\x19[\x8e(+!A\xb2\xc9=\x8c\x9d}\x16D\xf51\xd4\xe3c!\x1a\xe2\xd5T\xba^\xf1\xdaT=\xd7\x99!\xb7n{e\xc6D\xd8\x0c\xce,\xa1\xc7R\xe0KHI\xfc\x8aB\xf8\xa9!G\xe9\n\tIQJ\x86\x10W\x92\xd9\xecB\xa2\xadS@T\xee-\xb6\xf8\xb7\xd9\xe5\xd1.{^\x15~m5J\x9a\xfcZ\xa2H\ty\xa7\x03N\x82\x9c\xe5*A\xc2\t\xc9\xca\x16\x08R\x808\xd2\x132\xf1apw\x8c\xda\x98\x91\xde\x1f\xf0\xac\xda\xfd\xde\xb5\x9d\xbb\xb6i\xdam\xa3p1\x849L\x8d-O\xc3u\xd2:B\x8f\x1c\xb6z\xf25>o\x07\x13\x8bM\x18\xfc^[\xa9\xa3\xb9\x827\x16\xc0\xbcv\x86\xee\x9d`\xdf\xb4\x95\xc2\xa9\xd3\xdc-\xbc\xd9W$+\x07\x1c\x90\xaf\xe6N=\xc6\xb9\x8c\xad\x89\xb8\xb0\xdc\xe9+\x86NB\x0e.[KW\x8c\x1c\xff\x00}i\x06\xa6\x86\x12|zQ\x92\xd0!\xae\x88\xe8\xe3Ha\xf7\x9a\r\xceT\x8aR\xa9\xb51\x86\xf2\x0b\x83R\xe4Qq\x8a#\xf6\xc5\x9c\xb4P\x93%\x94\x0c\xb6\x9c\xf9\xf1\xd6\x84]\xcd\xea\x00nm\xe1V\x91=h\x93 \xf0Y\xe3\xc4\x1d\x0b\x1d\xee\x1e3m Rh\x94W)\x1c\xdfZ\x0b\xab9 \x9e\xf5=\x0b\xb9M\xda\x91\x05e\xd8\xf0$\xd7\xd6\xfcD\x85)^\xdfa\xa2T%\xaeNh\x1a\x96\xb2\xf6\x8ag\xc8\x054\xc8\nP\xc9\x1f}X\x14(\xa8\xbe\xa05\xc9F\x91C\x96\x14\xd2\x08-\x9f\xac\x13\xa1%\x87S\xdd\xce-]E\x84%\n\nO\xd3\xe0\x9f:!\x91\xaez\x80\x9c]\xbd#8\xe0\x0f\xb6@\x07\xc9\x1a?Ve\x89\x7f@\xa9Se\xe0\xb201\x801\xa3\x19\x16\xfa\x81F\xe7+\xbe\x8d&|%|\xaa\x8f\x8e\xba\xd1eR\xcbbz\xa2\xf3\xf0\x8a\x9d2\xa0U\'>|\x9dJ\xaa\xcag\x80\xb3\r-\xea\x9a\xe3pC\x8b9\x1d\x85j\xa4n3J\xee\x18\xd2n\x14\xba\x03n\x00A\x18\xf3\xa7\x87\xb8\x05D\x972\x81\x16\xaa\xc9ZR\x02\xbc\xf7\xa2\xe2\xad\x03r\x92\xa9m\x18H\x05lt\x0fJ\x1a\x13\x8b\x8c\xd9N\xb9\xcc\xc3qIZ\xc2q\xec\xad\rWP\xc6\x84\xfb\x83\xba\xaa\x93n\xee%\xb3s\xcb,\xa9\xd7d?\x02\xa0\xf3jBS!\xb7HSj\xe0\xa2W\xf9\xc9l$+\x008\xac\xe4\x11\x8f\xa4\x04\t\xf3\xd4\xc5bWz\xe3\xca\xb5\xee\xb9\x82\xdf\xa5\xb7U\xb6j\x0e\xaf\xd5@%)L`\ne1\xd1\xef\x8a\xb8\x12\x8e\x80\x0e\xa8\x91\x91\xd2[\x92\xb6\xba\x8fJe\xfc\xc5\x1e\xda\xef\x85\xd9\xb6\xfb\xce\xcc\xc7\xea3gZue\xa2\xa1)\xb6\xe5\xa9\xc4A}IS%\xcc\x9e\xc0QG\x15g\xdf\x919 \x9d,\x1amu4\xaf\xb7q\xd5\xbfp\x9an\xe1\x84\x9be\xca\x93\x10nP\xca\x9a\xa9\xc1\x96\xa2Q \xaf\x86\x16\x80Bx\xf8\xefDT\x91\xa8\n\xc1w\x07\xf7\xb7\xe1\x0e\xc2\xdc\xeb\x15\x8d\xba\xbd\x9eq\x17+l\xad\xd8\x15\xd5\xa0\x07\x92\xe2\x86B]?\xce\x9e\xb1\xfbh_\x08\xca\xbcXu\r2\xb63\xc8O\x9bWf\xdb]{\x7fxJ\xb3\xee\x88\x05\xa9\x90d)\xa7\x12|(\x03\xd2\x87\xdc\x11\xd8\xfbk\x92\xc0\xe1%L\xeb!\x19\x16\xc4$\xb7iJL,>\x8c\x1cx\x07K\xbeGq\x95R\x05^\x94\xf4I^\xab \x80T1\xfb\xe9\x19S\xe6\x185\n-[\xa6dH\x0b\x89\xeb\x10\x0fA#KU\xd4\xd2A\x94\x97]\x1e}A\xc4\xcaJI\x1c\xb2u>Eo\x88X\xcf\x19D\xd56\xb8f\xf2\x8f\xcb\x888\x03>\xfa\xe7\x93\x90d\x8f\xd1]KZM-\xdad\xf4?,\xa4)^\xe4\xea\xccn\x0f}\xc9\xc8#\xb8\xc4\x8fQ\x84\xf5\x18\xbc\xcc\x8c\xab\x18\xc0:w\xccg\xb6\xa2\x86\xf7\x8d\xf35\x07J\xdb\xe3\xcdG\x03\xcfZx\xf7-\x191\xbb\x82\xea\xa6#\xd4\xe2\xa4\x0f \x0c\x8d\x08Z0\xee\xbb\x9e\xe7\xda1\xe52\x1ci\x00\x9f|h\x99.\t\xeeE\xa6S\xa6S\x9f\xe2\x84\x90>\xc4\xe96Gp\xbb\x10\x86\x1dq\xbe>\x8c\x90<c\xcf\xbe\x8ce"a\x06W\xd6\xe3E\x9a\t(I$\xf5\xc7L\x19\x10\x8b0@"V\x9aT\xa6\x13\xc9\x08\xc8\x03\xc0:\x03\x9f\x10\x86\t\xa9.\x8b1e\xff\x00\xac\x91\xc7\xee|i\xe9\x91[ba\x10\xb2\x91p\xae:p\xf9\x07=\r<\x18\xb2(N\xb5K\x963\x8c\x94,\xa4\xf5\xe0\xe9\xa1\xf5\x06\tV\xe2\xc4\x9a\x8fQ\x18\xfa\x8f\xb1\xd2\xdf\xf1\t{\x9fMoM\xcd\xdbo\x88Iv\xa5~\xfe\xbf$"Be8\xf5\x06\xa7MaJa\xe5\xa5?SN!I)nBT\x91\x85\x02\xa2\n\xd3\xd2J\x82u\xdc\x1e\xed\x89\xc4!\x81:\x8c\x1b\xfa\xcd\xb9\xe6m\xedJ\xf9[\xe9\x14\xf8s\x95&L9m%\x84K\x8f\xcc\xfa\x92\x06\t(J\xa3\xad\\\x81$\xfd=\xa7\xd8\x9b\xdd\\\xc4\xab\x81\xd4\x9f\x87\xed\xb6\x83P\x9d>\xa4\xb9q\xd8\xa8Gr\x1dR$\xc4\x85ro\x96\x0b\x89\x07%KS\xcaQR:9\xc1\x18%G@\xaa\xa3bk\xb3\\\xfe\xee\x04\xdb\x9fn6Y\xcau*\xb6*3\xe9\x05S\xa9RT\x82\xa5\xc9\x84\x95}I\t rR|\x9e\xb3\x81\x93\xac7\x8d5<\xb4\xec9N\x9b}\xf1\xbb\xb4\xb7\x8b\x14\x8a5V\x87T\xa8\x11\t\x1f4\xf1G\xfc5\x80\x02\x9e\x05\x7fR\x92\n\x8e@\xf6\xc64\xa5\xf2\x94\xb5\x18\xe6\xf1\xd8\x0eRe\xff\x00\xb3\x1f\x0b\xd7\xd4\xc6\xee\x9d\xd0`\xcd\x9f1\x942f\xa5e\x946\x9eE)_C\xafo\'=\xe8\x9f\x1e\x0c\xdba\x00d\xca\x83Ff\xaf\x89_\x84\xab\x9fd*\xab\xacY\xb1_\xae\xdb2~\xa85H(.\xa5\xbf\xfaVS\xef\xae~o\x17\xd26\x9b\x12\xec>J\xb8\xa6\xee!\xeas\x14\xf09o*+\xe0R|\x82=\xbf\xf8\xd4\xa5K\r\xcaC\n\xb3,)TW\xd2\xc2_\x00\x13\x9c\xebB\xd4 E\xc9\x92\xaaq\xdaB\xd2\xb6\x86G\x8f\xb6\xb3\x80mMf5 \xd3&@K\xa9[\xd2\x1ag.\x00\\t\xe1)\xc9\xc6I\xf6\xff\x00\xef\x8f~~\x7f\x16\xcdMG7\xa9\xbf\xbe\x1d\xbf\xc2{ow[d\x11]\xbe\xee\xc4\xcb\xae\xcb\xb9\xa9\xaa\xf9\x9bfw?\x96\xa4\xbe\x94!xWm\xb88\xbc%%\xc4\xe5*CC\xb3\xc8\x81f\x0f\xa6\xa2\xe3\xf7\xf7%\xcd\xe6\xf2zQ\xaa\xfe\xf2\x07\xc6_\xf8_\xdb\x1byhP\xd5\xf0\xcc\xc5F\xa3W\xa7\xc4}\x8b\x92\x14\xa9\\\x84\xc4\xc5\x88\x97\x9e\x9a\xd8WiR\xd6\xb4\x0fL\x1e9X\x03\xb1\xdb\xb2x\xaa($\xcc\x1eU\x13\xce|\xf4\xf8\x91\xb6\xea[\'\xb9\xd5\x8d\xb9\xba\x9c\x8a\xba\x95\x1ab\xa2ND)!\xd6\xd0\xea\x7f2R\xb0\x00V\x0fD\x8e\xb2=\xf5\xc9\xcd\x94az3\xa3\x89FE\xb1\x00\xa2\xd4\xe3\xcd!\xe6\xc8\xef\xc0:<YU\x85\x88/\x8e\x8c\xec\xba\xa9d)-\xe4\x121\xfb\xe9\xe5\xaa.\x8c\x876\xa8=,qYs\x1e\x123\xa9\xb2\x1eGQ\x8b@J\x8f\x9c\xab\xf2/?\x01\xd4\xb6\x15\xda\x8e\x87\x8f\xdex\x9b\x84T)\x11\xdd\x01\xc4\xa7 \x0e\xf9\x8d+\xc8\xc8\x13\x16\x8c \xa2\xe7[\x8e\xbdH\x87\x14\xa5 \x05\x0e\xfa:\xf8\xe7\xf2\xfc\x86\xf2j2\x94\x08\x1d\x16\xe1*\xa8\x9fK%\'\xecu\xf6\x1e)\xca1\x02\xd1d\x8a\x97\xd1g\xcbq\\\x83\x84\x00:\x19\xd7E2\x12 \x11s\xc5F|\x84\xb6\x14\xea\x89\xc1\xec\x13\xaa\x14\x98\x04Q\x90\x9e\xab\xa9\t\xfaNS\xfb\xe8\xc1\xdcS\x83>\xa4\x7f\x875:\xd9\xba\xec\x19\x96cp"1\x1e\xdc\xaf\xfc\xec\xcbu\xd4$\xb9\x12RJ\x8a\x1dB\xb8\x10\xa0\xa4\xfd9*\xc7\xf0\xfb\x1d\xeb\xb9\x84\xa8^3\x91\x9a\xc3\\x\xdc\x97,\xab\xd2\xc6\xb9\xac\xe6\xe1\xc5\x90\xfd\x1ab\x9b~\x9eTP\x99\x90$#\xf8\x0b\xc0\xc7\xa6JH\x04\x8c\x8c\xa4\xe7\x19\x18s\x1b\x15\x15d8=E>\xccQ^\xda;\xd26\xcb\xde\x17C\xaf\xd1\xe3DZ\xa8Q\xcd)\x94\xa9I*J[\x92\n\x96\xa3\x90\xc2\x15\x18\x80\xa4\xe1E\x19I\x04\xe1(x\x9a1\xceA\xea\x16\xd6\x1b\xa0\xd9\x92QK\x99T\x8e\x11\x11\xb9\x12P\xddI\xf0\xf1\xf4\x93\xc5*e<\xc6Rx\x8c\xe18\x1eGC\xc1vn/\xb1\xf9\x99R\xec\xa2\xca\xa4\xfcU?b\xcc\xb5\xc3\x14Z\x8a\x96\xbb}\xe6\x1d\xf4\x92\xf4W\xcfHiC\xf9Fq\xf6\x03:\x95\xb1\xaf\xad_\x07\xa9H\xc8}\x10D~Y0k\xd5)q\xb6\xd1\xab\xf1\xf8\x96\xdb\xa4\xa2\'\xe1\x94v\x96\x80\xebd\xf1IJ\xf2\x08# \x9c\xf6{\xf7\xd5\x01J\x8a\xf8\x8ag\xae\xa4\xfd\xb7\xdeG-\xcb\xfe&\xde3V\x8e\xe5\x0e\xb0\xd3\xad&<\xf2\x946\xfb\x888%>\xc8=\xfe]o\xa8\x01\xe3\x04co\xdc;\x8a\xef\x89?\x847\xaf\xcb\x9aU\xc9\xb6\xb4\x06\xa3\xcem\x05n\xc7`}\x12\x02F0@\xe8+\xf5\xd2sx\xde\xa6\xd7F;\x0f\x91\xc0\xd3L\xc4\xd5}4\xb5\xc9\xa2T\xe2-\x99Q\x9cSO0\xb4\xf1R\x16\x0f`\x8dr\t\xa6\xe2gUx\x95\xb1(\xea2\x9d}~\xa3I +\xb0\x08\xc9\xd6\xa9 \xdc\xc6\xaa\xdc9\xf82\x89\xb9R\xbe(md\xedu\xbe\x9a\x94\xe4\xce\xe2\xf4w\xa2\xad\xe6Lu\xfd\x0e\x87\x02Zp\xa1\x05* \xaf\x89\x03=\xf5\x9d9y6ABO\x93\x8f\xa6I\x9feh{\x97wm\x8c4=\xb8v\xaa\xe3\xd4\x08C\x14\xc9\xb1\xa2\xb6\x811%D\xa5\x97\x83?B]B\x8a\xfe\xa6\xf0\x87\x07\xd4\x90\x92Ki\xf9?\xd7\xdf\xabq~\x89\xfa\x06O\xa9:s+@/@\x93\xf7?\x15\xf2~\x04\xab\xe8\x7fK\xff\x007\xf2\xc7\x8e\xadW\xb2O\xc0\x1d\x99#n\xb7>\xda\xdc\xea\xe4\xfaJd3m\xd5&Fu\x98\xf5\xb1\xc1F\x1a\x14\xb6\xdcp\xb6\x15\xff\x00\x98T\x86\x94\n\xb2\x90YI\xc63\x9f\xcc\xff\x00\xc3\x8f\xf1\x9f\xff\x00V\xfdW\xfc\xbf\xea8\x17\x0b\xb5\x94!\x89\x07\xff\x00\x89\x04\x0fp\xfe\xff\x00a>\x93\xeb\xff\x00\xa4?\xca\xbco_\xc7r\xe0~\xe1_\xdc~?\xf2\xe6#\xff\x00\x13\xdf\x82_\x87\xe9{^\x98\x9bOa\xca\xa6\x8bl.D[\x89\xe9\x14\xd81\'\xad\xc5z\x92^\x99*R\x84\xda\xa4\xb5\x84\x8e\x1c8\xb4\x0b\x84$\x12r\x7fp\xf2\xfc<yq\xda\x8e\xbeg\xc9x\x9eS\xabS\x1e\xff\x00\xa9\x9f:\xa9[\x1e\xa5(|\xb2\xd4\x8c\x1caC\xce\xb8\xde\x83\xe3\xeau\x19\xc3\x1a?\xf6\x93j\x1b\x05Z\x88\xc0~<\x80\xae\xfc(i\x8ar\x1d\x18\xb2\x00j\x83\x8f\xdbR\xa9\x13\x9bnS(\xc2\x08\nV\x8fbx~%\xb5Z\x93o;OYm\xe4\x95(~S\xef\xa0cb\x17\x10~`;\xb1\x17\x1b\x9a\xe3\xbb\x81\x93\x80\x93\xed\xaf\x9f\xf3=b\xf5z\x8e\x18\xc5Y\x94UZ|\xea\x89\xe0T\xa2\x9f\xbfZ?\x0b\xc3NA\x8fql\x84\x89qi[\x90\xe1\xc6S\x8f6\n\xf3\xdeG\x8d}\n\x85\n*\'\xa9p)l\xbe\xe6"\xa0\x95x!:5 \x1b3\'\x17lz\xcc\xe5\x12\xd4~\x8f\x80F\x983\xa0\x80A\xb9\x16\xa1\xb5\xd7\x1bl\x17\x83!)\x1d\x9f\xa4\xeb\xdf\xc4\xa4\xce\xe6\x9b\xda\xab\x96\xe8\xdb\x0b\xf2%^\xd6J\xe1L\xabS\x94\xcc\x96b\xd4x\x96\x0bi\xfe!>\xcaP\xe8\xf19\x19\xc7\xb1\xce\xbb\xf8\x98\x83c\xb9\xcbu\x0c\xbb\xea67\x1b\x7f\xae\x0bz\xb5I\xbc\xe2\xdcl\xd3\x1e\xb8"\x7f\x97j\xc8\x82\x80\xc2\x94\x14\xdf\xd2\xf3\xbfO\xf0\xd4\x87\x16\x16=\xba$u\x9d5\xb20a\x14\xb8\xd7\x8e\xfe%\xf6\xe3n=&\xf5\xba\x11m;_\x9fI\x8f\x05\x99\xcf\xb4\x87\x9dK\x8a\xa5:\xa7\x1aKme\xb5\x1c\x80\xe2T\xb0\xb5t\x12\x1dO\x8c\x1dc\x9bi\xaa-n=\xf6\xde\x87m\xd7\xec*\x85.\xee\x83,\xdcb\x0b\x12T\xfdEeMKW\xa6\x96\xdcz9=\xa1\xcec\x8a\xfc\xf4\x10}\xf3\xaa\x16\x88\xaa\x88m=\xcc\xcf\xbbW\x9d\x06\xf4\xb0\x9f\xa0\xd4f\xbdI\xb9\xed\xb6I\xb7\xd6\xa7@uN\xb4\x00SK8\xc0%\x18\xe3\xd7e\x03\xaf:K\xd3\x8a\x1d\xc7\xa7\xb7\x7f\x10\x87\xe1\x9bpm:\xba\\\xb2w\x0e\xbd.\x0b\x88\x84\xdf\xcb\xcaq\xec\xaf\xd6 \x82\x92G\xe5W?\x04\x0cw\xa0\xc7\x92\xc54\xdc\x89\xbdu"o\xef\xc2\xe5\xd9N\xa7J\xb9\xec\x9a\xc2\xa6S\xa1\xb6\xb9m\xa0\xac\xa9h^;(=\x11\xd8\xf0>\xda\xcc\x98\\\x8b\x13S(\x06\x13|-\xfcE\xd2\xa0X\xf4\x9a%\xd7r(U\x94\xff\x00\xa4\xfa\xdcV\x03\x0c\xa9\x04%K\xef9\xe5\x80s\xed\xa3\xc5\x90q\x17\x03"\x1eV:\x94?\x18\x7f\x0e6\xa6\xe1\xda27\xbbo)\xcd\xb1_\x83$1\\\x8b\x17\xeanns\xfcD\x81\xfc\xddgH\xf2\xfcp\xeb\xcdF\xfec<l\xed\x8c\xf1\'S"9M\x98\xcc\xa0\xc3\xad)#\x07\x90P\xed\'\xdc\x1f\xd7\\\xb5%Zt\xc8\x0c%\xa5\x99|_[1s\xc5\xbf6\xe6\xe8\x9dJ\xaa\xc4u*\x8c\xfc\'T\x92\xae\xff\x00"\x92:ZI\xe3\xf4\x90A\xf1\x8f\x1a\xa00\x03]\xc4\xb2|\x1e\xa6\xd8\xd9\x1f\xf1"\xdd\xcf\x89[\xce\xc3\xf8O\xde\xcb\x82\xd8i\xea\xfd\xc8\xd3\x13nDBR\\\x8e\nV\x10\x82\xa48\x94\x17\x94\xb2\x86\xfa\x1cA898\xc7\x0b\xf5/\xd1>\x9d\xfa\xab\xc0?N\xf3R\xc1\xdd\xff\x00\xed#\xa2?1\xff\x00N\xf2|\x8f\xa4\xf9\x07\xca\xf1\xcdW\xf7\xff\x00\xf2h\x9f\x87\xf6\xa4\x9d\xc0\x80\xcd\xdbwZ\xf3\xda\x87uT-\xf7\xdc\x87P\xe1"EJ\n\xc2W\x1d-:\x80\x958\x12\x03\x81\xbeAKC\x80\xa4\xfd\'_\x86\xfe\x92\xff\x00\x03|\xbf\xa0~\xa7\xc3\xf5\x1c\xfe@\xe1\x8c\x86P\x07u}\xfd\xbe5\xf8\x9fg\xf5_\xd6X\xbc\xef\xa7\xbe\x0cIE\x86\xff\x00\x91\x97\x1f\xe2oR\xd9Q\xb05\x9d\xc5\xafX\x14\xeb\x9aM\x15\xa2\xd2\xe9\xd5X.6\xb8.\x85\x00\x1bR\xd2\xe8z99\xf2\x94\x94\x9eC\xac\x1d\x7fKd\xa6^Gg\xf3\xf9\xb9\xf9\xd6\x0b\xe7\xc6\xe7\xc6\x9aV\xe9N\x84\xff\x00\xcc\xa9\x8eag\x96\x12z\xfe\xfe\xfa\xe6\x92\xadv\x04\xe8\xd9S\xa3.\xa6\xef\xf4\x0fM,\xc9\x84\xb4\xa8\x0f\x03\xbck\x00\xc4\x8b\xd4b\xe4bw\x04n{\xaa\x8f_\xe4\xf4c\x85+\xfea\x8e\xf4\x8c\x9c\x0e\xd6\x10}Jx\xec\xbb<pH\x03\xff\x00\xdbS|\xc7\x0b:2\xa2\xe6\x8f\xf2\xa1<\x96{8\xc0\xfb\xea,\xd8\x96\xec\xcaR\x94T\xe5M\xa2\xd4&D\xf5\x9b`q\x1e\xe7\xadyq\xbbu0\x95&36\xcbia]\x94\xf5\x05\x12\x15\x8c)I_\x83\xaaC\x11\xdc\xe5yY]\x1fCS\xa5wk\x7f\xd3\x97\x8c\x87^. \x1c\x8eG[\x94\xb6QK\x17\x87;1\xd8\x93\xed\xeb\x92\x92\xfb\x00)\x86\xc1#\x1d\r|\xef\x98\xden\x02x\xc7\x9b=O\xed\xc5r\xb1\x1e\x9c\xe2}$\x10RA\x03\xdb\xf5\xd4\x9e?\x99\xe5d\xcbF\x00\x0c\x18\\\xba\xa5\xc1\x91\n\xa3\r\xd7\xa8\xeb\x9fS\xa8\x05\x07\xaa/Ou>\xb8\xc0JO\x12\x94\xe7>F\x15\x95\x0cg\x19\x07_\xaa\x05a\xf1"%XP\xf8\x87\xceT\xb6f\xdf1\x99v\xad\\\xa5\xdc\x94\xe1\x1d\xd9l\xca}\xb8\xebp\xb4\xe1)PB\x8a\x12\xfa\xd3\x92@\xceF@\xe4\x0f\x9a-\x06\xbebO\xa8\x04\xef\xbdw\xbd\xacX\xa6\xa2\x0c\xc0n\x06e\xado\xd4\x1a\x90\x97[_\xae[r3\x05%G\x82\x82[*\x19\xe4\x95\x820\xb2R\x90E\x9c\x1e\xa7\x90\x1b\xdcel\x17\xc5\x1d\xcf2\xb1T\xb2n+RC\xf7 e\xc5|\xfc\xd6\x7f\x86":\xb4\xa1\xa7X\x01I_\x02y\x90\x92FF0\xb3\xde\x19\x8b0f\xe3\xf33."G!\xf1*~ \xb6\xdau\xd1x\\\x96\xbd\x1a\xa4\xd4i\x10\xe3\xc6\x9a\xc4\xb7\x96\xe8J\xe4\x8c\xa1\xd4\xb6T\x8c+\x9a\x02U\x82F\n\xfaQ\xf1\xa6:\x96j\x11h\xd4\xa0\x18\th\\&\x99Uv\xe6\xa7R\x90\x8fA\tC\xec\xc3q!\x05\x07\xeaK\xa0\xe0\x92\xe6F}\x8f]\xe99.\xc1?\x11\xc2\xc9\x8c\xb8;\xddT\xadR\xe6\xc6r\xe7\xaa\x84\xbdNR=E\xa0-\n%9B\xceI?\x9b!Y\xeb\xb1\xa2\x0e\xdb\x9e\xe2\x03\xcc\xc4\xc5\xdb\xfe\x99\xdf\x10\xef\x10\xdc\x97\x1a\xa9\x17\x1b\xa9\xb6\xb4c\x8a\x81O&\xb0\xae\x81\xc9$\x0f\xd3P\x8c\x9e\x9b\xf22\xa6\xc6\x1d8\x89\xb5>\x1e\x8d\xe1qUi\x11l\t\x8c\xbdG\x9f\x99M\xca\x99\xf5\xf8\x1d4\xe2=\xcfx\xce\xba\x00\xb6\x80\xeas\xd9M\x9b\xee*~96.\xa1\xb5[\xa2k\xf2\xe2\xc6K\x15\xd6\x8c\x84.+<\x1a\x0e\xe4\xf3H\x1e\xdeA\xfe\xba\xe6y\xd8\xdb\x1e`GFt<<\xbc\xf1\xf1n\xc4\xcc\xb7u\xc3\xf8q\rF\x8f\xc9\xf7\x16\x11\x19D\x91\xc1D\x1c\xaf\xae\xf2\x94\xf2\xc7c\xb2\x0e\xa5,H\xd4\xa8\x8eS\xa6\xc0]\xe3i7r\x85\xba\xaf\xd0QW\xfc\np\x94\xd55\xe9E\xb0\xeb\x88B\xbd.K\t$\x04\xac\xa5D\x81\x93\xc7\x00\x8c\xe4{\x1b\x00\xd7\x04\xa1*@\x8c\xbb\xcf\xe3\x1e\xeb\xbf\xed-\xc4\xb7791\xd6\xe5\xe7R\x87p6\x9ad\x10\x86\xda\xaf\xb3\xe9\xb6\xe4\xd4\xfdYl\xba\xd7\xaa\\\t8R\xd6:\x00\x00\x18s\x06fc\xf3\x17\xe8\x85\x0b]\x0f\xf8\xf8\x90m\xbb\xcf\xe2\x83|\xad\xd6m:\xce\xe9\xd5\x8d\x14SE9\xc6]\x90\xa2eC\x0b\xe6\x96^>^B\x15\xf99\xe7\x86HN\x07Zn.yuz\x80B\xa9\xb5\x14a=/\xe0M\x9a\x84!"%i\xd5<\xb5\x9c\xf2t\x1c\xfd\xcf\x8d1\xfcLl;\x80s8\x9d.\xcf\xf0\xc8\xdd\x194QQ\xb6^2\x15\xc7!+GG\xfb\x1dM\x93\xc1c\xfbf\x8f,\x8f\xdc"\x8a\xad\xf0\x9b\xbb\xd6D\xa5\xc2\xaf\xd2\t\x01]\x04\x05d\xfe\xbd\xeaV\xf1\xb3\'bT\x99\xf1:\xcfh\xd9[\xae\x14c!\xda[\x88O\xea\x8c\x9f\xf6\xd0\x9c/]F\xfa\xe2\xf4e\xf5\x9b\xf0\xeb\n\xf5R\rA\xb4\xa5}\xe3?\xfc\xeb\x9d\xe4\xab\x05&?\x13\x860\xbe\xb5\xf0\xedG\xb4hD"?\xa8J{\x18\xeb:\xe4b\xf3\xb3\x06\xd8\x9a\xf9Qu\x00\xed\xfal\xcbZ\xab\x84\xadl\xa0\xaf(R\x0f\xd2\x7fC\xa2O0\xber\x1aA\x93\xc8G4\xd2\xee\xebjM\xc1\x03\x13\x16\xda\x8a\xbc\xab=c]\x8fY\x14\n\x80\x8a\x08\xf6\xc1#i@\xa4\xc5[\xad\xc9<\xb0O\xd2z\xd4\x1eve\xf4\xa58\xd4\xde\xc4\x0b\xbe\xee\x18\x94\xeaz\xf9<H#\xfa\xea\x1f\xa7"\xb3\x92F\xe5\x8c\x14-K\xbag\xc4t;\x1a\xe7hV\xa8H\xacQ(\xf9o\x0eH\xf4\x89R\x00F\x12|\xfd8\xe8\xf7\xd7\xdf_||\x82\xa7S\x8a1{lve\xa3\x7f\x13\xd6\x96\xe7\xdf\x92\xaeW\xad\x03p|\xa4\x10\x12\x85pi\x96=.9\xe0\x95+\x0eq@Rr~\xb5\x03\xd0\x18\xc6\xb7\xf8\x84g\xb8>\x8eD^\xe1\x9d\x0bt6\xb2\xec\xb6T\x9d\xb0\xb1\x1a\x80\xc3\x0c\x06\xaaQ&4\x14V\xa5\xc9.6\xd1Q=\xa5`4\x82q\xd1H=\x14\x8d<e\xc6\xe3B\xa2\xbd7V\xb67\n\xed\x9b\x12\xd1\xdc\xdb9\xab\xf2\xdd\xa8?\x06\xe9\xb5f\x1aS\xad\xfc\xc3hzCJ.-*\xc8\xfc\xc9\n\xeb\x91\x03\x05g\x1a5\n}\xc3\xb1<I]|\x18M\xb8\xbb\xb7&\xbf\xb3\xf1w.\xd9\x83&%A\x0e\xa2\x97Z\x8e\xb9.4\xa6\x14\x12\x82\xc2\xca[<V\x85\x80q\x8f\x05$w\xd6\x1e23 z\x8a\x18\xed\xcf\xda\x04];\x8c\x8b\x963NS\x9d\x8a\x85\xc5}FKP\x1d\xe3\xeb\xc8R\x89R\xd3\x8ce*\x18\x1fl\xf7\xef\xd0d\xc8\x1cj\x1a)S<Zu\xfa\xccJ\xd3\xf4XP\x1fJ\'\xa8\x08A\n\x05A\x1d\x85\xb4r{\x05_\x7f\xb0\xd2\x03\x91\xa8\xd2\x00\x17\x0e*6.\xdb^v\xddn\x9dY\xb3WPv\xa0\xf3i\x872#\xbc\xbd\x07\x1aO\xd4\xb5c\xae\x7fP\xcf\xdf\x1aaT \xd8\x8bVpl\x18\xd3\xf8[\x81P\xda\xc5\xc6\xb0\xaa\xf57\x1a\xfc6(\x97N\xa86r$4\xbc\xe1\n\x1f\xf3\x0e\xb3\xa7\xa0\xe2\xbcd\xee\xfc\x8d\x88K\xf1\xe5)\xad\xcf\xd8\xe4*\x94\xc7\xce\xd4(\xce&I}\x07\xc0#\x8a\xc7\xdf\xc0\xff\x00m\'\xcbNX5\xd8\x8c\xf1\x9c&M\xcf\x9bS\x9a\x9d[\xb8Z\x83\x1d\xc0\xa54\xca\x96\xb4\xf2\xed%D$\x1c~\xc1C\\\x12h\xf1\x9d\xb0?\xd3,>f\x83\xd9\xad\x84\xb1\x1f\xa52\xf5\xcfSk\xd6_g\xd5\xeb\xce\xa8\xc6\xa9\xf3\x17n;\x967\xb6\xc6m\xd5\x16\xa1\xf3p[a\xdc\xa7\xa2FI\xfe\x9asb\xc6\x16\xd6)I-FE\xa5J\xaaR[E*\x8b\x11L\xa0\xf5\xc8\x8e\'\xf6\x1a\x00Yz\x8c\xf6\xc3+Nu\xfdD}\xa8\xa9a\xc0\x97\x15\x94\xbaVH\xefF=`"\xd9q\x99\xa2,?\x89z\x9d\xa7\x01\x8a\x1dZ\x98\xe3\x84\x802\x07@j\x9fP\xa8\xdc\x99\xf1\x83\xd4\xb9\xdc\xaa\xa5\xb3}R\x1b\x95\x1e\x90\x85\xbe\xe0\nJB<\xfd\xfb\xd5"\xdc\\\x9c\xd2\x1b\x81\xb4\xba\r\x8f \x1aEv\x94\x86])!$\xe3B\xd8\xc5\xd1\x9b\xcc\x91bQK\xd9\xaaKUw\x05\x11e($\x14\x94\x8f\xcb\xa9\xf3\xf8X\xf3-T~/ \xa1\xdc\x06\xdd\xc9\xf1mv\\\xa0V\x1dG2\x93\xc1C\xdf\xff\x00\x9d|\xfb\xf8)\x85\xe9\xd6\\Tf]w3\xc6\xea\xd7\x97o\xd3\x9c\x9e\xdc\x1em\x04\xe5*\x039\xd77?\xd3\x8f;Y1\xc0\xc0\xc1\xab?r\xa3\xdc\xd6\xf0n \xcb\xc7#\x87\x1e\xc9\xfb\rca8\xf1~e\xfe&%\x02\xa4\xf9\x96\xf5\xd2\xe5\rFbJ\x1c\xc1)l\'\xb0?]B\x9fM\xf2\xbc\x86\xb64%9rc_\xdb\x14\x17%\x99w\xdc\x13\xd7\rQ\xde-\x85~d\xa7\xce\xbb>\x1f\xd3\xce#\xd4\x81\xf3\xd9\xa1\x17\xd4\x8d\xb6\xa8M\x8e\x995\xa7V\xf2T\xa3\xc1\xb59\xc5\x19\xef\xb2\xa1\x90A\xf3\x9f\xd3\xf5\xd7i1\x92\xa0\x98\xb2\xcaF\xa3R\xc0\xb2\xef[B\x98\xc5\xc7Ef\x1c\x96\x15\xc5ap\x9cJ\x9d\x86\x90\xa0PT1\xd7\xf78#\x19\xefL\xe0\xcb\xb1\xf1\x04\xba\xb0\xe2a\xad\x03s\xf6\xd0\xd5*3\xef{l\xbb:\xe6a\x86\x1e\x99\x11\xc5Ff*\xdb\x19T\x82\x11\xd1*X\x04d\x8c\x16\xceU\xde\x9a\x99\x10\xb5\x9e\xe2[\x16@\xb4#\xd7\xe1z\x9f\x07v,\xe9\xf4\xaa\x15L\xd6j\x11\x80\x02\\.HT\x97\n\xca\x92\x16\x08\xc0Y\xcaS\xc0\xf1)Q\x1d\xa8x\xb3\x0b\x07\xd0\x93\xe4\x1c\r\x99EsU)\x16\xec:\xedr\xc8\xba\xa14\xf2k\x11!\xd6b0\xe1\xf4p\xb4\x14\xc7ymd\x84(\x04\x94\xf4\x12\t\xec\r\x11\xa4$\x8e\xefs\x07\xb8T]\xd9\xd4\xdb\x86\x0c\xf1L,%n,%)\xf5\x00\xe6\x85{\x04c\xb3\xf6\xc6=\xf4\xb1\xd5\x18\xdd^\xa5\xef\xe0w\x1d \xc0\xb8-\xe7\x1dzW\xd0\xff\x00\xa3!\\\xb2\xa0H\xe0A8\t$g\xfa\x8d\x0b\x03z\x87\xa2\xb54N\xd5V\x19\xbdl\xdf\xc5\xec\x86\xe3R\x1c{\xea\xaaB\x96\x8c4\xcb\x98\xc1P\x03\x1d\x9cc\xaf\xdfN\xc6\xdc\x85\x8e\xfed\xce\xa5N\xc4\x17\xb4o\xcb\xd6\xd6\xbe\xda\xa2]\xd5\xa8Ri,)_#;\xd6\'\x01g\xa4\xfd\x8ar:\x1a$r\x998\x93\xa9\x8e\xa0\x8b\x9a\x1e\x8dv\xda\xf3lY\xd4\xea\xa4\x98\xaf;.\x9c\xeb\x11\xa6\x14}*P\x1c\x8aN:9\'\xad5\xa8\x82LU\x1eQA\xf0\xb7\xb4\x1b\'\xb9w\xb6\xe8^\xd5\xea3m\xfe\x18\xe52\x9fLCH\x05!\xc4\xc7R\xdf__\xfeE\x7f\xbe\xa3\xc3\x8b\x16L\xaeH\xea[\xe4e|8\x10\x7fS"\xefW\xc3\xb5v\x90\xb4^V\xcc\xf4\xbfH\x07\'\xd2=\xb2?\xa7D\x7f\xdbK\xf2<B\x9e\xe5\xeao\x8f\xe4\x064\xd09\xfaeBT6\xc5\x19\xc7$\xcbQ\xc6\x163\x9f\xbe\x96\x83\x92T{Z\x9b\x87\x9bQ\xb2\xf5J\xb5M\x0f\xdd\xd3\x12\xc2\xd0\x9ea\x07\xc7\xe8;\xd1\xa62\xa7pK\xf2\x97i\xaa\xce\xab\xdfOY\x94x\xc8"0\t.p\x1cs\xe3N\xfd\xc7\x8cXf\xb9GwS\xf7n\xd2\xba\x13*\xabAK\x90\x82\x81K\xc8\x07\x18\x1a\x00\x8c\x1bs[\'-F]#r*w\x05\x1d\x943C,:\x94\xe08\xa4\x0c+\x03\xc6t\xfce\x81\xd0\x92\xe4\x1e\xe9EQ\xae2\xd5E\xd97\x13\x89m\xd6\xd2\nP\x93\xe0\xfd\xf4\xf6(E\x9e\xe7\x80\xe3\xa3<\xbd\xbe\xd4X\x14\xd13\xd7\x1e\xab\'\x8a\x94\x9e\xc2\x80\xd03\x80\xb3\xc1Kj-\xf7f\xea\xb5\xb7R\x9e\xaa\x81\x90\x94>\xc8Q\x04t\t\xd4y\x97\x16m\x9f\x89f2\xe8(DL\xbb\xca$\x80\xf5\x16\xa5I.Fo\xa2\xe6\x01\x1f\xdb\\\x8c\xd8\x1d?h\xb1:8|\x8cex\xb4\xad\xb4$m\xfd\xbdXUn#(\x01$\x92\x94{\x1f\xdb\xdbR\x15\x16\x0f\xdaR\x118\xfbL\xe3woK\xb7\r\xc2\x98\x94T\xf0\x8a\x07\x17\x1c>V>\xda\xaf\x1b\x9e]jG\x98\x03\xf3\tm\n\xcd\x08\xa1H~ \x19o\x05I\x19#W\xa9R5%\xe1\xee\x8bwm\xbam\xad\x1ae\xd3FC\xf3\xe1z%M%\xd5\x90\xb0\xd7\x1f\xcb\xd0\'#\xa4\xf41\xe4\x82z\xc3\x98\x15\xdcAc\x16\xf2.\xdd\xf9\xdce\xbb\t\x10$A\x8f)H%\xb6$\xb8\xd6R\x9f\x03%XW\x93\xe4\x7fmFNW\xb8\xef\xf4\xc0\xb1\xb9mK\xa2*\x95>56\xfe\xb7\x94\xa4\x95\x96\x95&k\xa1\xa5\xc7X)Qq\'\xa0\xe18#\xc8\xc7,\xe1Y\xfaX\x82\x850\x9e\xc8MX3S|\'n\x8d\x03h\xdfb\x8f\x12\xe7\xabIL\xca\x8b\xad\xbe\xda\x1b@\x8c\xc0R\x909\x12\xa0J\x943\x95\x14\x91\x9e)\x1a\xa7\x0b\xa6<\x94\x0c\x9b*\xb3\xa7#Z\x85\xf6\xdd\x936U\xb5pA\xba\xe6\xba\xb82X}_)\x16\xa3\xeb\xb5$!YK\xccq\x00\xb4\xb0\xd2\xc0\x089\xc1\t)\'8\x17\x81hA\xeeN\xc6\x9b\x90\x8a{J\xd9\x15J;l\\\xf1>R\xad\x06{\xd0*\xcc\xa1!\xa4/\x8f\xd2\xd3\xe9\xc1>T\x0eq\x81\x92:\x1djT\xe4\xc9M\xdc~B\x15\xb5\t#U\x95F\xb4\x9aa\xca{jN\x14\x85\xcbJ\x01u\xe5\x95\x1f\xcc\xaf$\xa4\x8f\x7f:\xc6\x01D\xd4^[\x9f\xdd\xaa,Rb\xcaG\xf9\xb28\x89"\xa2\x87\x9cW\xce\x9f\xc8\x9f\xe4\t>\x14\t\xc8\xcfZR\x90\xad\xa35\xc1aFF\xb9\xa9\xd0\xe7\xdd\x0c\xca\x15\x14T#\xc6p\xfa\xb0\x98\xfe\x1a\xdfFp\x9eG\xc2\x8et\xd7%\x9a\xc4\x105_\x10\xa2\xcb\xben\xfbjK\xf61\xa7\x890j\xaa*\x88\xcb\x87\xb8kJ\xc1Rp\x7f0\xc1\xd3\x10\xb0\x05\x07\xcc\x03@\xdc\xbd\xf8\x1b\xde\x9b~\x1c\xbb\x8d\x8a\xcc\xd4\xb5\xf8\xe5\xd12Aqg\t[^\xa7\xa4\x9c\x0f\xb7\x16\xc64\x1e>E\xb6c\xf2I\x8c\xf2q\xdf\x15\xfb\x01\xff\x00\x11\x87\xba;\xab\xfeI\xa8I\xb2m\xa8\xe8]"\xa1\x95\xb8\xf3\xca\xe9D\xf9#Udp\x06\xbed\xd8\x92\xacAI\xf1\'l\xf4\xc87T\xfah4\xa9\x88\ne\xf4\x9f\xcaO\xb1\xd2\x1d8JW)}F\x05\xa7\xbdt\x0b\xa9\x85\x11J\x1e\xa6\x08i\xee\xb1\xfb\xfe\x9a\x10n\x19E\xf9\x95\x94\x8d\x9e\xdd9U\xb7o\x8bB!\xc1Y$\xf2\xc62|\x83\xef\xafQ\'PK\x00:\x8d\x0b\n\xe8\xa7\xde<\xf6\xff\x00r\xdag\xe6\x82BK\x9c|\xff\x00\xed\xa6\x86\xedOQL\xbc\xa0f\xedR\xa5\xed\xf5i\x14;RB\x16\xc1QP\x1c\xb2:\xfd~\xfa\xc6FSW4r\n\x01\x82\x15G!_\x8e\x8aK\x8a\x02Z\x13\x85\x0eC#\xfa\xfb\xebT+h\xf76\xabqq\xbdVMN\xd8\x88\x9e\x12O\x11\x8eI\n\xceF\xb3(\xa5\x9a\xa3w\x16\xb4k\x1e\xbbY\x9aT\x97\x96\x86\x942\x018\x07R>6v\xd4\x7f\xa9\xc4\xdc\xba\x99c=n\xdb\xaf\xb3\xf8cO\xadI\xcf<a_\xae\xb367U\xa1=\x8b"\x16\xb3\x16\xb3hq\x12\x85"5-yZ\x8a\x94Bs\x85\x7f\xed\xaex\xf1\x9a\xe5\xc3:\x05\xd4\x02\xad\xd3*\xd1\xab\xbe\xa3\x8c\xfa=\xf6G@~\xb8\xd5\x0b\x88\xdd\x19;\xb8\xf8\x86\xd4\xeb\x9a\xdb\xa5Z\xc5\x85\xcaW\xae\xbf\xcc\xb0\xa1\x9c}\xb4nP{D\x05S\xfb\xa1\xc4\x1d\xb7\x85\xbc\xf6t\xcb\x8a\xd4\x0e\xd2\xdd\x86\xf2\x9c]5\x84\x14%\xb4\x15vr\x0fh>\xe0\xff\x00\xcd\xd6\xaeN9V\xcc\x99\xef\x11\xa3:*\xd3\x81L\x81\x16\x836DgW\x1eb\xd8\x91\x15\xb4\xf1u.\xe7)P9\xc9\x1f\xa8\x04\x0e\xb3\xa1\xe0\xa7F\x0f&\x02\xc4\x91{\xd9\xb5\x14m-b\xadW\xa4\xcb\x96jT\xa92\xe9\xb2\xe3\xc7K\xee\xc7\x11\xbe\xaeEJ\xe9MeA\x04\xe3\xdb=\x105\xe6U\x0b\xb9\xe0l\x80 \x95\x83R\xdb\xea\xdd\x93N\x95K\xdc%Gu\x08K\x14\xc6\xe16\x8f[\xe6\xb0\x14\x83\xd7i\x00\x0e\xd4\x08\xe3\xd7\x9c\xeat(@?"5\xc3\x03B;6M\x8a|M\xc9^\xde\xc3\x92\xe3Q\xd7\x19t\x8a\xacGx\xba\x18y\xe4\xb5\xdbn \x94\xf2\xf5\xbde\xf7\x82R\x9cw\xed~\x12I\xa3\xd4\x9b!\xd5\xc8\x9b\x85m\xdd\xb6\x9c\xc6\xa9\xb5\xcaJZg\x82X\x94\x12\xac!\xeeC\x1c\x9c\xeb(X\x08\xce\x0e>\xac\xfb\x8dk#\xad\xd4\xc5`N\xfb\x8b\xba\xa5:\x15\xb0\xd3\x8a\x9fQ\x91\xf2kq\x0e\x14\x8c\xa8r\xe5\x8fQ\x03\xc8\xe8\xa4\xff\x00]!\x80\x11\xe8MJ\nL\xf8S\xab\x02\x81"r\xe3\xc6zPq/F\x00\xa8#=\x84\x95\x0ct\x7f\xdbI`\x1b\xb8\xd0H\x10\xda\xdf\xb5\x95ef+\xd5\xd4\xd5_\x99\xc8F\x96\xd1\x04\x85g\x90\x03\xc7_\xae\x8dTc]\x98\xa6,\xf7\x08w\xd9\x86 \xd9*\xbd\xa2:\xecj\x84\x08\xe6J\xcbJ\xc7\xd3\xc4\x85\xf6?c\xfd\xb4Y\xc8\x18\xecv\x04\xf6 y\x80bsc\xeb\x8d[\x94:C\xd5H\xd9e1\x1amxV>\xa2y\x13\xfe\xfa\x9f\x00Q\x89nS\xe4Q\xc8\xd55\x9c\xaf\xf4\xff\x00~m\t\x16\x1a\x14\xb8u\x18\x10\x12\xf5.R\xd5\xf5\x95c\xc6}\xc6\xae,\x99G\t\x01V^\xa0\x8d\x8f\xbc\xcb\x9bBsi7\x88\xb4\xe8\x8e\x92\x88\xc3\x96q\x8e\xb4\x91\x96\xbd\xad\x08b\xbd\xac\xea\xdd\xcbdQ\x1f\x8b\x16\xd6Z\xd4\xb6\x0e\x16\xdaOg\xff\x00}g%\xfb\xca\x00=\xcdS\xb1\xdb\xfbC\x8dg~\x19P\x88\xa8\xce\x96\xfe\xafP{}\xf4\xd5")\x94\xddE6\xedUm\xf7\xee\t\x13\xe8\x15\x8fFS\xca\xe4\x87\x90\xaf\x07\xed\xa5\xf2\x13YO\xee\x88\x9b\xbe\xff\x00\xddj}t\xc5\x939rH8C\x8aI\xe8jW\xc9\x95MJ1"\x1f\xdd%[\xd5[\x8e\x15~5\xce\xd2\xdc+R\x81|\x00z\xfb\xe9\x98\xb2\xb7+32c@4a\xa5\xdbN;\x8f=\x90\xb9\n\xc0G\xfc,\x7f\xe9\xa7\xb9.bV\x81\x97\x16\xdd\xablP!\xaa\x14\xf8@\xbc\x81\x82T\x93\xe3Z\xab\xee\xd4\x1c\x85*\xe0\xad\xca\x98\xb3]T6\x14\x92\xd6O\xd0~\xdf\xbe\xa9m\x8ftB\x1f\xb4\xae\xa5\xd9\x14\xa6\x08\x96\xa6\x19[J\xcf O\xbe\x97\xc1\x08\xb1\t\x9b\x89\x82\xfb\xb5\xb4V\xdd\xc2\xe8\\\x04\xa1\n\t\n!\xaci90\xa8\xea9\x18\\@\xee\x86\xd2\xd5\xad\xa7\x0c\x88\xec\xa9H\xf2\x13\x83\x9dA\x93\x1b)\xeaT\xbe\xee\xa6\x9e\xdb\x9a\xcd\xb5i]\x93\xe8\xfbS\xf2\xf55\x84\xa5\xe7 \x19\xa8Qu\xa5\x14\xfd\x04c\x8f\x12G\xbfc\x07\xbd^\x18)\xd4\x99\x81e\xf7K\xeb\xdffa\xdeRO\xe1\xd4\x98\x94\xafQ\xa7$ST\xb7\xdaZV\xea\xb9z\x8d\x05\x15%@~R\x9c\xa9Dg\xa1\x8d<\x80\xc4}\xa2\xb6\xb3\xf5r\xcf\xb7d\xdaA\x0b\xb4^m\xb4\xd1\x11\x12l\x838!+qM\xa8)\xa01\xcdHVH)%#<\x0f\x95dk"\x95\xa8\xae\\Ze\x1d\x93\xff\x00)\xed\x8c\xaa\x84J\xbdA\x95\xc8\x95\x15l\xd1\xaa\xfc\x96\xa4a\xc4\x8c\x80JO\x12\x142\xa4\xe3\xc9\x1d\xf5\xae^ \xab\xdfs\xa1\x97\x90\xaa\x8e\xdb\x8e\xf8\xac[\x8e[\x14{j\xbbV\x85Tf\x84\xcc\x9a\xb9\x89\x18\xfc\xe4\x84\x89-8\xe1\'(.)G\x05!G\xa2\xd1\xf6s\xe9\xb1X\xa8\x0b$)d\x99eP\xdc[\x96\xa9Y\xa8\xd476\x93J\r\xcd\xa8\x87\x83\xcc\xad+i\xa7\x17\xc7\x98*\xe2\x81\x8eG=g\n\'\xf6\x0f\\\x8cM\x18\xb3\x8cV\xa0\x0e\xf2\xd2\xafs\x16\x05b\xc9\xa9\xc6r8\x8aW\xf2\xb3\x9bP\x0f\x00\xa0\x14\x90\xbc\x0e\\s\x8e\x81\xf68\xd23\x06\r\xec\x8e\xc6@\x14`f\xd6\xdemN\xbd\x93E\xbd-wX\xff\x00\xc3a.\x179\x1eg\xa29\x00?\x97\xd8\x81\xe3H\x0f\xbfp\x8e)\xafl`C\xa3T\x9d-&\x9c\xa9>\x8f\xa6\xa1\x01\xd2\xc6P\xf0O\\B\xbe\xf8\x1a\xf1\xe8\t\x80\xa8\x9e\xf7B\xf3\xa6\xb3\xf0\xd5r\xc7\x0f\x94>\xb8E\x88\xa4\xab+)qa\nH\xff\x00\xfa:\xcc\xce?\x86hxT\x9c\xc0\x88\xbc\xb0aR%\xd4E\xbdXJ\x03\x08HNR\xa3\x90\xb4\xf5\x8f\xf6\xd1\xa8\x1c@\x82I\xb2O\xe69\xb6\xfa\\95F\x04j\xc3\xac?\x18\x16\\\xf4\xce\x07\xa6<d\xe8\xb5w\x07l\xbdJ\r\xcf\xdb\x88\xd3\xaf\xf5V\xe8\x15\x85\xa29\x00\x8c\xab**\xf7\xd4>N,\xd9|\x9fa\xd4~&\xc6\x98,\xf7#\xd5\xac\xcb\x82\x88\xccz\xcd\x1a[\xa1\xf2\xb1\x9eI=\xea\xac8\x8ai\xb7\x15\x93)\xab\x021\xf6\xee\xabt\x99&5\xc5Yq\x87\x16\x80\x02B\x08\x18?m?jj,\x90\xc2\xc9\xdc,\x89dEUH\x86\x9erZ\xd5\xf5\xe1j\xeck\xdc\x0b\x1fl\xd1\x90\x05\xa3=\\\xcd\xd2\x9dmIb\x00C\xcc$\x85(\x8c\xf8\xd1Z\x11Q|\xdcO\xd6%J5n\x12\xe9R)\x08l\xa3\xff\x005J\xfaU\xfa\xeb\x00\x0c54\x92\x05\xce\xf3\xdcU\x9fQB[\x08\xfa\x8e\x01K\x87\x03\xfa\xe9\xc2\x97\xb8\xb1\xbb\x9c)\xf7\xd4\xa6n\x84\xbd46\xe3*9__\xfd\xce\x87\x9d>\xa6\x84\xbd\x99S\xba\xef\xc5\x95Q2\xa0\xb1\x82\xb4\xe3\x03\x1e\x7f\xbe\x96\xf9\x0b\x18\xd4E\ts\xfb\xb5\x94\xbb~-)\xf9W\x8c\xf7\x12\x14\xa3\xfc,\xf4?]\x166\x00Q\x9et\xe5\x047~-\x1e\x83^\x8cl\xab\xa5o=%_\xc3\x8a\x15\xd2\xf3\xed\x8d\x13\xd0\xe8\xee(\x06\x1d\xce\x97\x16\xde\xde5\x8a[\x1f\x8c\xd2\xdbm\xc2\xd0#\xeb\xc1\x1f\xbe\x95\x95Y\x85F\xa3\xf1\xdcC\xb3\xb9;\x91H\xb8\x0e\xf0X\x16a\xa6D\x11\x983\x92\x98\xb8\xc6F\x14\x94\xa4v\x06H\xf3\xaex\xca\xce\xd2\xb3\x8c*\xfb\xba\x84\xd6\xd6\xe7\xd7wF:mj\xea\xdd\x0f\n\x82$\x08\xad4O\xaa\x8c\xfdC\xfe\x8cc\xfe\xda\xa7\x16s\x93\xdab\x9d\x15G !\xa2\xb7\xb9Wm\xc4\xfd\xa1]\xa6F\x8f\x1e2\x04\xa9\xd5\x04;\xe9\xf1t+ \xa9C\xaey$\x94\xe3\xd8\r=r?>?\x11\r\x8dN;\xbd\x99\x1a\x85k\xd3\xd8\xbd\x1f\xb1\xa51M\x87=\xea\x9a\xdcT\x86;)o\x88X_%\xf4\xdaOJ>\xddk\x17\x17\x17 |\xc1g\x0c\x9c\xe5\x1e\xfa\xc9\x85k\xee\x1c+\xf2EDT\xcc\x1a\xba\x92\xf3.\xba\x94\x85\xa1\x05\n(\xc2\xbf?I\x03\xea\x039Vs\x8d-\xe9\x1a\xfb\xdcj{\xd2\xa0\xe5gw\x9e\xb8\xa9R\xed\xea\r5\xa8\xb4\xd7j\xab\tJ\x17\xc9\xc6\xdaJ\xca\x9bIWx\xc2V\x13\xd9\'\xa0}\xb4+\x91\x8b\\\xf1\xc6\x07q\xcfhP\xc5\xff\x00\xb6\xee\xbfP\x88\xa7\xaa4\xd7\xcc\x87)\x92\xd7\xc9m\x81\x92\xe3@c=\xa5!X\x1d\xe5GW{Y$\xe4Q\xd4S\xdf\x1by^\xaa\xcb\x97U\xb4\xa9\xed\xbd\x1a;\xc9u\x95\xb2xzL\x81\xf9\x08\'\xb2\x0erN\xa6\xc8\x8c\xc65\x1c\x08Ain\x0bS\xe8\xac\xd8\xf4y\x06\x0c\x98H\x0bm.\x02R\x1d\x19?\xdc\x8c\xfe\xfa\x12\xc4j\x18\x00\xae\xe0\x96\xe4\xd5a\xd7h4\xdb\x10$\t\xd5;\x82\x13E\tH\x01(\x0e\xf3Z\x87\xdf)I\xd4\xd9\x81la~\xe4J\xb0\x9e\x0cO\xc0\x12\x9a\xec\xbdWL1\xd8E!\xb68\xc98\x91\x91\x9eC\xa5\x03\x8f\xdbL\xf5E\x90>\xf1<mE\xcb\x8d\xbb\xdf\x08v\xcc\xf1\n\xa7\x04:_p\x95\xb8<\x11\xed\xde\xbd\xea\x83\xa34-F5\n\x88\xfd\xd1=5\x06\x14\xafEn\x850\x07\x8f?\xef\xa7\xe2fq`D\xe4\x1cEFe\x1e]\xac\xee\xe2\xd3m\xca\xfdA\xd3\x1f\xe9\x12#\xfag \x0f8:{en\x14\x06\xe4\xc4(z\'SA[\xd6\xee\xc0\xdc\xd5)\x94\x97\x9ej#Im)\x86\xf4\x85\x80\xaeX\xfb\x9e\xf5\xc6l\xdef\x0c\xdc\xb2\xad\x83:H\x982c\xe2\x87c\xef\x15\x97\xce\xd8\xdd6M\xc3*%.\xe7J\xa3\xa9C\xe5\xa5\xb4\xae\x88>\xd9\xd7O\x1b\x86\x1a\x90\x10\xe1\xa8\xff\x00\xbc\xfddY\xf0cJ\x9a\x8b\xcd\xd5\xccIo\x92\\eC\xc9\x1e\xf8\xd3q\xa0m\x89\xa4\xb0\xd1\x83mR\xa5D\xaf\xbd.D\x87"C\n\xc3\x0c\x04\xe0\xa8g\xee5\x85H\x1b\x99`\xf7.+P\xad\xba\xb5%Q\xbd\x17\x9c|\xa0\xf1\xc6T\xac\xfe\xda\xd2A\x00O-\r\xc0\xf9\xf6\xe2!\xa6;\xf1ja+K\x98SNtq\xfbhH\x00\xf77\xf7-\x88C[\x87Gj\x03B\xbfSi\x05\xc4\x8c-.w\xfdt#.\x12\xc4\\w\x0c\xa8\xbb\xd4\x16\xb9\xec\xa9B\x1b\x86\x8bU.\xb4\xa4\x85#\xdc\x91\x8f:\xf5)\xea\x10\xfd\xb1W]\xa7Lv\xf2\x8f_KyM5\x03\xf8\x89\x1d\x05{\xe9\x01\x89\xcbC\xe2{\x80\xe3\xb9ep\xef\x8d~\xadm\xbc\xf3\xd5\x8e+k)m)8#\x1f\xf7\xd1;\xb5\xdd\xc3\x01x\xee\t\xec\xef\xc4\x8d.\x9beI\xb6\xeej\x0cy\x0c\xad\r\xa0-LeAhI\x01\n?\xce\x92\x00\xef\xdb\x03Sbe\xc6,\x88Y\x15\xb2\x0e7=\xed5\xd3m\xd3\xdbr\xe2\xa2Q\xfeb[\x92\x94\xcb\xc2{\x03\x929$\xe3\xd3?|\xe7\x03\x1a\xa5\n\xdf!\x12\xdc\xca\xf1&/wq\xaa\x85\x1e\xf1\x9c\xa6!\xceL\x97\x1eT\xb7\tP\xc3\xaaqg\n8\xeb$\x93\xd7\xe9\xfd\xd5\x96\xc1\xb1\x19\x89\x87\n0\x9e\xcc\xde-\xec\xdb\xea\xd2\xf7\x9d\x16\n\xeb\n\x91\x01pW*KE+\x8aR\x9e(^\x148\x1e\x88O\xb7\x8f\xb7Zkf\xc8=\xfd\xc4zx\x98p\xbf\xcc\x85&\xf5N\xe4\xd0\x1e\xb9w\x16\n\xa9\xd2\x1c\xaf-\xa9\ti\x1c\xd6\xda\x80\x04\x05\xfa\x85!Y\xcap\xac\x94\x9c\x90s\xd1\x0b\xb3\x959\x18\xc0=6\x00}\xa4j+T&o#\x19\x15\x03\x1e++qM\x98\xb8um\x8c\xab\x8a\x88\xe4B\xb0H\xcf~\x0eA\xf04H\x00\x9ea\xba\x11\x93\xb1[\xd2\xd6\xd1\xdem\xdcW\x02\x94\xfc\x7f\x96t%\xd7\x96J\x1eq\x04\x1e\x7fI\xc9\xc2\x14\x7f0\xce\x0f\xb0\xd3\x06@\x82\xe2\xd99\xd0\x8c\xda\x97\xf9B\xa5}K\xdcM\x93\xb8#\xbbB\xac\xcb\xe5\x0e5B)J\x10\xa5\xf6[\x1dxP\xcf^1\x8c\x0c\x1c\x06\x93k\xcdb\x82\x95\xf6\x99\x9d\xdf\xaa\xd5`\xee\x85Yo\xdar\xdf"Cn\xa5\x8a[\xdcAo\x9e\x14\x07]\x1c\x0c\x0f\xb6\xb9>nf\xf1\xcf)\xd1\xf1\xb1\x96Z\x12\xb6\xe3\x99Z\xbd7V\x9bo\xda\x1bkq\xd3\xdb\x8b"]V\x9e\xf5u\x9f\xe3>\x96XP!!\x03<\x02\x9c\x1d\xff\x00\xd4>\xda\x93\xc7\xfa\x96\x1f/\x8b\x124w\xfc\xe3N\x17Dj\x1d\xcbJf\xc4\xd5wV\x04\x9b\x8a\xe5\xaa.\x8e\xa0\xe9\x94\xe4e\'\xf3\xa3\xc2\xb1\x9frF\xba$\x96\xda\rI\x14(4\xdd\xc9\x96M\xaff\xd2\xaa\xec\xc4\xaa\xda3\x95\r\x94\x95\x034\x80_\x03\xf9\xd0tx1\xe4\xe5o=\x93"W\x10.=,\xf5S\xee\tl=lR\xdf-0\x80\xdc(\xe9N9\xaf\xed\x81\xef\x8cj\xb5\xe2\xa3f\x84CY\xf8\x97[\xa1h\xdd6#pkw\xac)\x14g\xaa\x0e\xf2a\xd7Y\n\xc7\xeeF\xb0\xe4\xc2\x07\xbd\xbb\x82\x13!\xe8T\x87;\x9d\xc8\xa6\xd1\n[\xee\xbe\xd3aY)\xe2\x1e\x03\xdf\xce\x8c*_\xb7\xa84\xd7\xde\xe5\x8c-\xd1\x94\xe3B\x1bN\xa6Dx\xf8C\xad\x97r[V\x8a\x94\x1bQ4\x83^\xe96\x15\x1e|w\x7f\x1b\x89W[I\xe4V\xf3\x01_\x9b\xac\xf8\xd1\xa0P,\xc5\xb1 \xea\x17\xbbI\xaf~\x1bN\xab\xc8\xa5\xa9\xd4N\'\x8a\x9d\x8eABG\xef\xac9R\xe8B\x17Ve|w\x05\xb5x3p\xa9/,:\xa2\x86\xdb1y!G\xf5\xf6\x07B\xb6\r\xfc\xcd$K\t4j\x04\x8a\xe2\xa5\xd7%5\xebL\x07\x8b(G\xe5\xf7\xf6\x1ae\'\xee1a\x8f(\xaf\xba\xad%H\xb8\x9d\xa6\xb1W\xf9\x94\xfa\xdcY#\'\x07=\rJp\x12\xd6\x9dJW \xaa}\xcb\xd9\x13&\xed\xc2\xe2S\xeb\xd0\x0c\xf4\xf4\x1de\x03\xcaG\xb6\x7fl\xe9\x80\x00\xb4L\xc2M\xe8N\xbb\xe5z\xec\xae\xe7\xda\x91\xe8[ob\xb9G\x9e\x94q\x94\xa52\x94\xf7\xef\x92\x9e\x8f\xef\xa9q\xe2p\xed\xf6\x8cg\xc6\xcb@Q\x99\xb3q\xed\xebJ\x8b\x01T\xcaE\xdd\r\xe9\xec\xc8m\x12\xd9C\xa1E\xa0\xaf$\xebr\xe4\xc6)A\xdcb.B,\x88\x89\x9bY\x84\x80\xc4\x8b~o\xd6\xd3)nK!\x19\xc3\x99\x04\x10>\xd8\xd4\xdd\x9a\x8e\x876\xbe\xe2\xc0k\xd3zchm\xd5)\x1e\x9aR\x83\x86\xc8#\'\x00\xf6I\xff\x00\xbe\x9c\x8eR(\x8b1\x996\xb1HT)\xf7]N\x07\'"1\x15\xf9p\xa6$\x06\xa5) \x83\xc7\x1d\xf2\xec\xf8\xff\x00\x9b\xf4\xd5A\x817&\x1c\x80\xa8On\xde\x96\x9d\xdbi\xfc\xb52\x8e\x9a{\xef,9.+\xc7\x83rY\xc2\x81\x19H\xc0!\x1d\x0c\x0c\x8e\xcfy\xc6\x880qDAe*}\xb1ysQ\xa9\xd6\xab\xa9\xb1Y\x92\xe3\r\xaa\xb7\n\xa3O\x98\xb4(\xb6\xe4oE\xf4\xff\x00\x11\x1d\x04\xa5*\x0c{\x80pI\x1eF\x90P\xa5\x88\xdcg\x9e\xfe\xd3\xbd\xc7kQ\xad\xfb"\x91\\\x8d2D\xd2\xe3\x8e\xb1Pq\x04(\x82\x00(\x08\x1fl\x85y\xf0\x00\xeb\xbdz\x80I\xa0\xdbT\xa2\x99\x12\xd6\x81_]B\x85-\x84\xb4\xd3l<\xc2\x1f\t(W1\x85\x87>\xe4+\xdb\xc6\x15\xac\xe1\xb9\xe2\xda FU:\xe2\x89l\xd3\xe5[\xf2\x1dn\x9d\x1a\xb3\x11\xb7\xa0>\x85+1\x9fo\x1c]\xcfD\xfen<\xbe\xc7\xfb\x137\x18\xb0\xa4\xa92\xden\xcaV.\x06cHv|d\xd6`GRW!\xa5\xab2\x12\xa5\x15%\xd3\xfb\xfb\xfb\xeb\x89\xe4\xf9\x1e\xb6m\x0b\x03\xb1\x19\xe3\xf9XP\x95&\xbf?\x12\xdbm.\xe9\xd2>,`1r2\x85\xae\xda\xdbw\x90]m\x1e\\\x931\xa4x\xfdP\xc6\x7f\xa9\xd7\xcc\xe5\xf1\xb2\x9cl1\xfc\xb8\xff\x00i\xd5\x7f\'\x0e<a\x98\xea\xbf\xbc2\xb8\xad\xba\xbd.\x9d>m\x93[\xf5\x83\xeaq\xc94\xe7\xa3 \xa1EC\xc2s\xe3\xbf\xfb\xeb\xeb\xfc\x1f\'\xf8l\x01\x18np\xb2\xf9X\xb3\xe5\xd9\xab\x83\xcc\xd9\xb6\xd5\xf3m4E\x9f"mU\xb0\x86\xe5\xd1[\xc8\x94\x85\x1cv\xdaA\xf7\xf6\x03\xa3\xaf\x02\xc1\xdb,<Y\xb2_\xa7\x94h\xf4D\xedV\xb3i\x96\xcdK\xfd7\xac\xddK\xa4M\x81\x97M5\xd7\xcbS\xc2\x9cH)G\x01\x91\x91\xf7\xcfX\xd0y\x01\xfc\x83\xc0\xb7[\x96\x02q\xfb\xd4w\x07\xee\xeb\xb6\xf2\xb6\x1f\xa1\xdb\xe2\xafX\x9b\x1a#n917\x03^\xaa\xca\x01\xcf\x06\x902\x7f\xae\xbaX\xdb2\xa0\x0c\xa3_\x88\xa6\xf4\x99\xa9X\xff\x00S\x1a\xbb\x19j\\\x1b\x9d25z\xe1\x92\xd52\x0b\xac\xa8R\x90\x96xHY\xc1!>\x8f \xb3\x9e$\x0eX\x07Ta\x19\xf3\x0eDP\x93\xe5lX\xb4\r\xc2\x8b\xff\x00`\xfe\x1c6J\x9d*\xed\xb9\xea\x13\xdb\x8a\xfb\x8d\xba\xba\x8cw[mR\xc2\xf3\xc8\xb6\xd9\x0b)\xc2\xb1\xf9\xb1\x90G\xdcj\x91\x8d\x11I1\x03#;\x80\xa28>\x1d,\xbd\xb2\xda\xa9\xb0w\x82\xd9\xa9\xd3\xae\xcbq\xf62\x7f\x13m-\xb8\xcf!\xd1O\x94\xa9@\xfd\'\xc6\tH\xf7\xd4\xf9\xfc\\\x8e\x97\x88\xc3\xc7\x9d\x15\xfd\xe2\x11n\xb6\xe9Rw_yZ\xb7l\xcbl\xcb\x80\x9aX\xf5\xdab1Ba=\x9e\x81\xce;\xc6\xa2\xf1\xbco/\x81?2\xcc\xb9\xfctj\x1d\x18\xa7\xde\x9bKvYT*S6\xda\xe8\xb4\xe4\xb8\xafM\xd7\xf0\x96\xdep\xf4\x0f/l\x8c\xea\xaf\x1f\xc5\xf2\x95\xf9e\x88\xcd\xe4\xe0(\x15`\rZ\x04\x9bf\x0c\xaa5Z\xf1\x80\xe4\x86\xf3\xf2\xcbR9\x9e`~^@\xea\xee\x0c\x82\x8e\xe4\xbas\xa1\x11\x8e\xfcP]{MW\x05v\xb4\t2$-y\x98\xb4g\x00t1\xfa\xfe\xba\xe1y~g\x95\x81\xf5\xd4\xee\xf8^7\x8d\x99m\x86\xe1\x15\xb7\xbbT]\xe2\x8d*\\z\xacv\xaa\xef4@\x87!a?\xc4>N|\x804\xbc?Q\xbd8\x85\x93\xe9\xd4\xc4\xe31{\xf1\x07L\xf8\x89\xb5hOQ,\x8d\xb9\x97PxF\xfe%J:\xc7\x00T:\xe3\x8f:\xf6\x7f;!R\x14P\x99\x8b\xc2=\x9e\xe6-\xb86c\xe26\x91Rr\xbfY\xb4\xaa\xd1\xdeZ\xc3\x8f\x95%__\xd4U\x83\xdfc\\\xcf\xc9\xeetJ{8\x81\x0b"Z.Sjk\x93\x1aK\x0bQY[\\\xd6s\xd7\xb1\x1a\xec\x90\x18\xd8\x9c`\xf5\xa1\n(\xd0\xebT\xb57TR\x10\xdaR\xf2U\xcb\xd3\x1d\x93\xd89#\xc7Z\xde\\MOP1\xd1o\xff\x00\x91e\xd9\x0f\xce\xbd#\xb7:\\iM\xfc\xb4GG\xd6\x16\xb2x\xa989\x00\xfb\x9e\xfd\xb5f6^\xe4\x99C\x03\xadGm\xb7\xb2\x94\xfd\xd6\xa2D\xb8,\xe6\xda\x89@r\x00i\xc8r\x07\'9\xe0\x95\xb8\n@)PO\x1e\xfd\x89\xd5h\x8b\x90r\x12vwSQ!\xba\x12\xeb\xed\xed\xa4\x8aeF\xac\x85K\xb3*\xce\xd1\xabA\x03\x9b\x92c\xb8}F\x1c\xec\x03\xd7\x15\x0f|\x1c\x1e\xc7Z\x9d\xc3\x04\xa6\xf8\x8eF\xb6\xd7\xcc\x1aj\xf3\xa3\xb7n@\xb1\xa8\xd5i\x12\x9dbk\xc8\x7f\xd4g\x01\xd0\xa5\xa4\xa5I)\x19$\x02RG\x7f\x97\xf5\xd4\xae\xca\x08\xa9B\xa9\x07p\x99v\xb5\x16\xde\xb7\x9c~\xa2\xd4eH\x8a\xfbR#\xa4<2\xdb*mIP\xe2S\x9c\xf2\xc1P `$\x03\xd9\xd1\x06\x00\xd4\x16\x17\xb86\xfdm\xcd\xcb\x0f\xd1\xeeK\x91\xb8\xa8\xa7\xba\xb8p\x9bH\x1e\xa3\xa5y\xcfD\xe4\x04\xa4$\xe3\xcf\xd4<jO3\xcb_\x1c\xaa\xd5\x93\x14\xee\x10\x88}\xf8\xee\xec\xed\x83v\xf6\xe09\x11U\x18\x14\xc6\x8cj\xdb\x90\x81%\xd8\xd8O\x17\x88?\x94\xa7\x888\xef\xdf\xbdp\xb26L\x19\xc6B=\xa4\xf7\x10x\xe6b\x82\x16\xecu\xe5a\xdf\x9f\x15\x97\xe5n\xb3W\x97J\xa2J\xa4\xd2Xf\xa4\x9a*\x9dmm\xb4\xcb\xae\x94\x879\'\xd3R\x8b\xa9)\xfaT\x17\x9fmt\x9f\x12#5\x8dw\x7f\xf9\xf7\xf8\x94\xb6\x1c\x7f\xc2*do\x93\xfe\xf1\x93G\\\'\xa9\xb3%\xd0\xaa\r\xbc\\l\xfd%\xc4\x97X\x04u\xcd\x00\x90\x95\x01\x8e\x89\xf3\xa9X\xfbk\xa19\xab\x89W(\xe6\x0f\x1f\xe5\xf13\xfe\xd2\xee\x86\xd9\xed\xb6\xef\xd5\xa5\xee\x16\xf5\xd4\xa8\xf5\x08\xef.4\xa94\xf9\xe9[\xe1\xa5v\x85\x83\xc7\x8a\x8a|\xe1$`u\xe7F\xa8\xbe\x98<\xc8\xfcO\xa07\x90\x86\xc7\xa8Im/cwR\xe6\xaf4\xad\xdf~\xe5q\xba\xca\x9b\xa7\\\xad\x00\x97d2\x10\x08K\tR\xb9\x1c\xab=\xab\xbc\x83\x8d\\\xbeN4\x04q\xbd\xf7&e\xce\x1f\xb1_\xcf\xff\x00\xa8\xc1\xd8\r\xbbnU9K\xdf;\xa5\x0f\x1a|\xf2\xf5\x16<E\x81!\xe4\x0f\xa7\xd3\x0e\x92U\xcc\x9f\xa7\t\x04\x82\x7f\x9b\xc6\xbb\x18q\x0f\xfa\xcf\xf2\x92\xe7\xca\xfc\xa9usM|?Rl\x08t\xff\x00\xf3\xcc8u:\xaak\xb2\x95>\x9bN\xf4\x90\xc3\xf1\xe2\xa4\x12\x86\x9dS\x9c\xd6\xa7\x8eTTS\x90\x06\x08\x1fV\xaeZT\xa9\x19\xe4_\xf9E\xbe\xfc\xfcHY5*\xd4\xa6-+z\x0c\xc7\xdc!\xb0\x891VT\xf3\x8a\xcaT\x9fU\xd3\xc8\x80A\x05@w\xc4`{i92/U\x18\x11\x80\xb2jU\xd3\xe6o\x0cz{\x11\xb6\xf1n\xc2\x8fV\x88e7@\x92\xca\xa7F\x9e\x94\x8f\xe25\xe9\x15}%_\xc3\xc7\xd4\x8eJR\xbc\xe0\rx\x13v\xb3\xc0\xa5wp\x9a\xd2\xf8\x85M\x1d\xe9t\xe8Q\xe1\xc9z\x96\xe3\x8c?#\x8b\xcd\xcai\\\x96\xa4%1\xf8\xa8\xac%\x00\x01\x95$\xf5\xd9\xf1\xa2\xf58\xeag\x00M\x89iW\xf8\xd2\xba\xe6Mr\xd0\xaa\xd2Z\xad\xc2\xacAu\x88\t\x8a\xdbO\xbc\x1e\t)RP\xd70J\xb9\x14\x80\x8c\x95\x02G\xdfZ3\x064E\xcf6?\xfa\xacL\xd9|ViRB-\x1a-"\x9b]\x94\xd4\x80\xe2\xd7\xf8\x8a\xa3\xc8m\xb4\xe1\x05\x0bB\x88R\x1d*8)\xec\x0e\xbb\xf3\x84\xbb+t!\xa0\xe2,\xca\x0b\xbfm7\x1e\xec\xb4?\x0c\xa9l\xc5^\x995+\naO\xf3r:\xa3$\xf6R\xbe\x18V|e\'J\xc9\x85r\xaf\x17\x16cS3#Z\x98-\xb6\x1bo\xb3\xd0\xearcn\t\x95o\xcb\nW\xcaJ\x83!iZ\x9c\t\xfaQ\x82<\x13\x90I\xd4M\xe0\xf8\xd7EjT<\xac\xdd\xa9\xdc,\xbaju\xf9v\xdc\xa1d\xee\x84\x83*\x08\r\xa6\x9fQAH_\xdb\x8a\xcf\x93\xa4?\xd2\xedI\xc2\xd7\xf82\xcc_Sua\xea\t\x9f\xaf\xbf\x88=\xed\xb5$\xa9\x17\xa5\x81T\x01M\x14\xa5\xc9\x8c\x10\x85\x91\xee\x0f\xdb\\\xc3\xe3\xe7^\xc1\x9d\x15\xf3\xb1\\\x12\xfcJ\x8b\x0eJ L\x98\xca\\\x90\x12\xb5JGa\xb4\x9f={\x90u\xd4]\x1a&r\x98X\xb1\'\\\x9b\x8b@n\x04Jm1J|2\xc9j@p\xe0+9\xfa\xff\x00O~\xbd\xb1\xa6\xdat"\xbd\xc4\xcfv\r\xfb\xfe\x9f\xdd\x08\xb8\x19\xaa\xaar\xbeMA\x86\x1c\xc6\x19Z\xc1G5$\x82\t\x19\xe8\x1f\x1d\xf7\xacC\xe9\xb5\xcda\xea\n\x87\xdbK\xf1Ip\xedl\x97\xe9J\x96\xc9\x87>\xac\xb3!\x98\xefe\x01\xb73\xc9Hk\x18\xebL\xc5\x9d\x94\x9d\xf7\x01\xf0\x8c\x80Ew\xc4\x06\xe4\xde\x117\x16e!JJ\x1e\xac\xb0%<\x94\xa0\x84\x90\xf1!%\x03\xbf\xa8\xa4\xab\xcf\xb8=\xe9~C\x92\xd5{\x85\x85T\xae\x84\x15\x1b\x92-\xf7P\xfb\xd2S%\xe4\x12\x1e}\x08\xff\x00\x8a\xb0I+ \xf8\xef\xf4\xfb\xf64\xb3\x93P\xcaV\xc48o\xe2%\xed\xc3\xb5\x9e\xa4\xb5\x03\xd3\xaa\xcd!\xb9n\xbaB\x81Q\xc8\x1d\xf5\xe4\x91\xef\x81\x8f\x7f:\xc4$\xb0\x98\xc18\x1a\x8c\xcb\x06e\xc7N\xb3!]\xd6U\xbb%t\xfa\x9f\xd7X\x84\xd2\xc1u\xf0\x01\xfa\xc3d\x80\x1cOc\x00\x8eIO\xdc`p\xfe\xa7\x97\xc9L\xfe\xb3~\xce\x8f\xe3\xf3\x11\x9f\x10\xf4\xc4n[uj^\xf3\xed\xf4\x9bf\xd7\x84YiK\x0cN\x97:\n\xd9\r\x902\xa0\x10\xa0\x0b\x87\xf4\xff\x00s\xa7\xe1\xf2F\\c\x86\xc4\xe5\x9c_\xc3\xe5\xb61a\xbe6\x9d\xf9in\x03\xb7M\xa7\xb9U(\x91*1\xe3\xc0\xa8\xba\xc2S\xc5\xa4\xa1Y\n\r\x81\xc7\x88\xeb8\xc1\x1c\x89\x07\xbd7\xca\xf3r\xd8:#\xe7\xfe\xe3\xf1-\xc5\xe4\xab\na\x1a\xfb{\xb6\x16\xdd\xa2\xf4J\xdd\xc9lQ\xebug8\xb8k\xb5\x04\x17$\xb8p>\xa0\xb79\x11\xf7\xc6}\xf4\x95\xc2Yh\xeeE\xe4\xf9\\\xd8\xa84!\xb5\xe7il\xcd\xc3Gv\xe3\xdc\x0b"\xdf\rEIy\xe9\xd3\xa3\xb2\x9e\x038\xc9R\x92=\xfd\xbd\xf4\xf4L\x97\xf6\xad\xc1\xc5\x9b?H\xd7\x12\xd7>\xe2l\x9d\x9fOv\xd1\xda\xea\xadZk\xce\xc8RM:\x1c\xe2\x18\x92\xb2p\xb5\xadE*R\xd2\x94\x05w\x9e=\xf9\xd7W\x12\x15[m~\'K\x1bea\xef\xa9+\xe1v\xb3Y\xdc\xcd\xebf4\xeaL\xf9q\x12\xf0\x8e\x9f\x90\x90\x96\x98\x05*\t\n/\x94\xe1\xa5)\tVV\x80I\xcf\xb7\x91w\x8fl\xf6F\xa0g\xe21\xf76Uwn\xf7\x9a\xb3O\x93{[7=\xc2\xa7\xa0CC+\xa3\xc1S+W\xa0\xda\xb2\x0bK(\x05@\x15\x82\xb4\xe0\x15\x02@\xc1\x1d\xdal\x93R@\xc2\x80\xbf\xeb\x11W%\xe7Cb=>\xef\xac\xc8r\x92i\xeb[\xd4\xb9\x8d\xac\x06]qh\'\x8b\x8d\xa7\x91R\x8a\xb3\x91\xc8\x11\xfe\xda\x90\xe4\x1c\xad\xb5(\xf4\xd8\x8dn.\xa0\xfcT\xddV\x15bs\xf7\x07\xcdE\x94\x96\x1a\x0e\xb0\xe3>\xbbOc\x1c\x94\xa6\xd6\xa1\xc8((+9\xe8\x01\xe3\xd9?\xc58\xc8CG\x1f\x1d\x1b\x18)\xd4\xf5{o\x85\x17u*\xcd\x07\xa9m.)^cJR\xca\xdc,\xad@\xad\x0e!\'\xb0T3\xfd0F0\xa2\xc3\x95^-q2\xc3\x8b{p\xa2\xedU\x9f\x1e\xb7C\xb9\xdfT\xa4\xd5\x0bu\xb8k\x88\xc4d\xcc\x8a\xeb|Zr9\r(6\xdb`<\x0f \xe8\xe6\xb4\x05 \xe0\x1d\x1f\xed[\xbb\x80)\x9a\xaaN\xbc\xb7\n\x8d\x19\xc4\xee\xbd\xd1h\xd1\xefJ;\xb8\x80\xedJ-4.Z\x14\x9c\xf1Z\xdaqN\x96T[RJ\x90T\xe2\x12\\\xc2\x15\xc5*\xcf\x98\x93\xb5\xdf\xfc\xcd\xe3]\xeb\xf9\xf5\x04\xa9\x7f\x19\xb7\xfd\xcf2\xb1\x17h\xea\xad\xd2i\xc2\xa0\xbfB4w=C#\x07\x88\x0bB\xf1\xc5\x0bN:\xef\xbcw\xa1\x1eVF\xb5\x15\xdc6\xc01\xad\x98Ion4;\x92\xd4\\\x9b\xee\xce\xa5M\x99\x1eb\xe2\xcfZc$\xb8\xdbJ))\x04\x8e\xd2\xa4\x82\xa2\n\x89\x03\xa1\x8f}92\x03a\xb7\x14P\x82\x08\x88\r\xc1^\xde\xd0\xee\x85=nn\x03sb\x05\x97!\xb36Am\xf6\x93\xc8\xe5\xb5\x8f\n\xc6<\xfe\x9a\x99\x86%:2\xa59\x0fpf\xa6\xe5[sg\xbb:\xb9\x0e\xa1>\x96\xa5%,%r2\xe1\xc7\x92\x90z\t\xf6\xcfZ_\xa4r5\x9e\xa1\x97\x18\xc6\xa2\xcfo\xac\x8a\x15\xca\xc4\x95\xcf\x98\xb6\x9dn+\x8al\xab\xbc/\x1fH\x03P\xa0\x17\xb9S\xd8\x102\xae\xd3\r\xce\r\xb0\xe9K\xa5\xd22\x1d\xfd=\xfe\xdf\xfc\xebH\x17\x17\xc8\xcfR`\xb1\r\x98\xef6\xa2\x07\x0c%*\xf7>\xff\x00\xbfz6\x00\x0b\x9a\x18\x96\xa92\x8dtG\xa1V\x9a\xae|\xa2e\xc8?B\x10\x8c\x10\xaf \x80<\xfb\xf9\xd2\xc3\x10A\x10\x98\x06\x15,w\xe5\xef\xf3]z\x81\xb8\x90\x17%\xef\x9d\xa6\xa62\x99\xc9\xe7\x1c\xb4\xa0\x953\xd7\x8f={\xe0\x8dfR\x18\x87\xfb\xc1\xc5\xedb\xb1\x7fQ\x82\xbak\xca\x92\x85\x05!eIR\x01\x05M\x8f\x1e\xddx\x07\xfbh@\ncI\x12t\x13\x14J\x8f=\xc7HB\x0fi\x8c\x90\x85\xfd>\t\x19\xc1\xf1\xdf~\x0e\x9d\xc1\x8d\x10b\x81Pw4\xb6\xc9\xfcB\xdbU\x9bB\r\xad\x12\xd6\xa9B\xaf\xc6\t\xf5\x1f\xf4\x17",\xc3\xcb\xfe#e)>\x9a\x8f\x95\x03\xee<\xeb\x83\xe5\x8f(+([\x06/\xc8b\x05V\x8cu\xfc,V\xaf\x9b\xda\x87X\x81M\xb5jR\x17O\xaa:\xdc\xb9)\x80\xb4!\xb0q\xc4\x95\xac\x04\x9e\xbd\xff\x00M?\xc1\xf1<\xa7A\xed3\x95\x9b\x19\x14n\x19\xdf\x1boZ~\xd5]^\xa7OJR\xb73\xc5?Q\x01g\x888\x1d\xf7\xd7\xf5\x1a\xe9\x9f\xa5\xe7u\xa6\xea\'\x1e2Z\xa4\xdd\x8a\xd9]\xec\x9bCT\xdb\xd6e\x12e\xbe\x84\xb8\xe4\x18\xd1y\n\x84t\x82x0\xb1\x8e+\xc0\xf0|\xf7\xfaj\xdc\x7fNuP\xacE\x08\xec\xc9\x81\xb4\x01\x07\xfb\x19\xde\xff\x00\xb1\xed\xcd\xd1\xb3%Z\x9burU\xe82\x84`*\xea\x9a\xda\x1c\xe0A!m\xa4\x1cy\x18\x07\xcfY\xd5\x0b\xe1aR\x19{\x99\x8d\x17\x13\x86 \x18\x94\x85\xf0\xb9\xb5t\xe7\x98\x89X\xafT\x8b\xed\xb4\x1aT\x86$\x16\xb1\x81\x8f\x03\xcfd\x93\xdf\xbe\xb4\xa69h.E\x88sg\xed\xf5\xbd\xb74\xef\xf4\xf3kk\xef\xae\xa7R.\x96*\x93f\x04\xfc\xaeGa#\x1d\x13\xf7\x1a.!E$\x02\xc4\xfb\x98J\x03z\xef\x96\xd9R\'\xb5M\xdd\x17\xa2q\xa2>\xf4\x85\xb39JO\xce4x\x16\x81\xe5\x82V\x82\x15\xfb\x8f\xd3K\x07*1!\xa3\t\xc7\x90u\xdcLXT{\xf2\xe1\xb7\xa4\xd6\xef\xcal\xea\xacXR\x19\xfc\x16C\x1c\xc2bq_\xf1\x12R3\x9eIQ\xca\xfc\x924\xb0\xaevv!6@\x1a\x86\xa3&\xe8\xde;l\\\x8a\x8e\xf5:\x03ra\xd4\x81\x8f"F\x1dBXJ\x12\x0f\xa9\xc9$\x80\x90\x92\xa0?\xea:\xf3\xe5\x1c\xe0\xa6*@Le\xedESa~"-\xe5:\xd2SJ\xbc \xc7\x13\xa2\xd6h\xed\x06J\x9bC\x84\x14\xa5\x04\x06\xdf\x18\xef\x18I\xc1\xebL\xc61\xe4\xd7\xcc[\x87\xc7\xd7QY\xbb;m\x7f\xd37\xca\x05!-7*\x1dJ\x9c\xe3\x11$\x87\x01\x8b=\x0b\xe6\x14\xa4c\x04+\x91NS\x80A \x11\xe3@\xe9\x90e\x02\x1a\xb60\x86\xa0\xd5\x9d~n\xdd\xbfK\xaf\xfc=\x15*\x8e\xfa\xa48\xfb\x8d\xa9*nH\x92\xdbg\x01*\xc8\n\n\x04\x14\x8f\xe6\xe0\x7f\xe6\xc6\x92\xad\x95A\xc5\xd11\xc5Q\x8f\xa9\xdf\xc4\t\xbb66\xe9\xb9\xac\xaav\xe5\xed\xcd\xe7\n\xafL\x92\xf6+\xe6\x9d,z\xb4\xc9)WA\xf6\t\n\xe2\xa2\xa0R\xe7iQP\x1d\x13\xa4\x94\x0c,C\r\xc7Fp\xa1\xeef\xf4\xd3\xdb\xff\x00K,*\xb9\x8a\x89\x12\x0b\xaf9\x15\x92T\xea\x94\x8e \x1e\xb3\xde2\x06}\x8e\xb7\x9eP\xb4\x9d\xcd\xe3\x8c\x1bh\'j\xd7\xaa4j\xf3\xcd^\xf5\x07jR\xfd,\xc6+\x82\xa4\xe4\x9f\xe4\x05C\xa3\x83\xcb^\xc4H{\xc8n{ \xd7\xb6:\\\xb6\xd4\xed\x04\xc3\x81A\xaa\xd4\x16G\x06\x89\x92\xdb`\xb8\xa1\xe0$\x9f\xab\x8e;\x03\xc6G\xdf]\x12\tY\'%\xfb\xc4E\xb1p\xbdA\xab\xa8J\x86\xae*x\xa1n\xa1y\xe2\x01\xc1\xfe\xfa\xe3\xa9\xdd\x99\xd2\x7fv\xa0\xcd\xcdET;\x9eg\xe1M9\xe9%\xc2\xea\x0b\x9fP\x089 ~\xbet\xd2\xa0\x1dE\x0e\xb7+WS\x97Q|\xb4\xd2x\x020V\xfa\x89\r\x8f|\x01\xef\xa0j:\x84\xa2W=M\x99DqS\x13\xeb\xb8\xa0T\x19\'\xca\xfa\xcfX\xecg\xef\xa4\x11B\x1d\x93\xdc\x99L\x97X~*ioS\x16\n\x9dZ\x99d\xb9\x84\x97W\xc0\x14\x95\xfb\x03\xc5)\xef\xc1>{\xd2\xb1\xb1\xc4\xadf\xcck\x9fP\x82\x05K\xda\x1d\x1a\xa3\xb8\xa8\x83@\xa4C\x0eH~\xa6\xb8\xf4\xe2\x92\x82W\x84\x8c\xe5_\xcd\xe0w\xfai\xd8\xfc\x9cl\x80\x1e\xccC\xe3ek\x1dC+"\xc7\xb2-:+\xb5\x9b\xb2\x8c\xfdRr$\x14\xb4\xdb\xb2\x0bl\x0ft\x85%\'+\xcf\x1fb3\x91\xd8\xd7C\x1a\x05\x16\xc3q\x0eX\xfe\xd3\x1b[-\x7f\\\xf6\xe3*\xa6\xe51R\x86\xc2`A\x86\xb5\x0e\x1eF\x00\x04\x921\xf79\xd3\xb1\x82\x82\x93Qy\x15;h\xf5\xb4\xea\xf7\xae\xe6P$[P\xee\x9a\x9bQZAMZb\x01m\x86\x92\xae\x87\x04\x8c\x15/9\x04\x1f\x1a\xacs+@\x999U\raD\xfeV!\xee\x95\x99\xeaB\xa5U\xe7TXq\xf6\x9a\x8e+\x19\xe2R<+\xae\x87\xe9\xac\xac\xc3\xe6\x15c;\xfb}\xa6\x84\xb3w\x9a\xd5\xb5,H\xb0+6\xb3\xd1\'\xb6\xdf\xa4\xf2\xd3\xd8qC\xb0A>F\xa8V\xd6\xfb\x93\x15\xe4\xda0^\xc7\xa7X\xf5\xbb\xf2Ue\x88\x92T\x99j\xe4PTx%D\xe4\x9f\xd7A|\x8d\xc3\xa6\xe3:^\xb6U*\x89W[\xb3\xe02\xe4\x17\xfe\xa4;\xd1)W\xdb\xc6\x96\xeac\x95\x95\x87\xe6*wR-.\xbbu\'\xf0\xd6J\x13\x1a? \xeb\x07\xdcx\xf1\x8d)\xa8\x9dB\x07P\x0e\xde\xb3\xad\x9a\xa4\n\x94k\xd6|\xf8\xce\xb8\xfa\xdcb9!-8\x95y\xc8\'\xfd\xf4*\x89\xca\xdaiw\x03]IWE>\xeej\x8f\x12\xda\xdb]\xc9\x8d\x11\x88C\x98\xa6\xca*\xe1#\xfe\x92\xb4\xfd\x87\xdch\x98\xb8P\x10\xea`\xa0m\x96\xe2f\xee\x91\x0e\xafr"\xa7zV\x05\r\xb9\xe9z-js-!\xd5\xb6p\x12\x95\xa59\x1ex\xe3\'\x1dgR\xd5\x8fv\xa3h\xf1\xf6\xee\x1e\xedD*\x1e\xd7\\\x14}\xd1\xb5\xf7Z\x896,U\x98\xd2\x98\x98\xea\xa2:\xbc\xb7\xf4\x85 \x85\'\xfeo\n\xefO\xc7\x8dq\x8b\r\x16\xec\xcd\xede\xa8\xc5\xde\xba\xd3\x17=\xbb\x1e\xeb\xa7W\x11\x02\x86\xe4\x84\xbc\x87\x1a\x8eL\xaas\x8a\xe4K\xad!$\x15\x04\x92\x15\xf4\x9c\x14\x9e\xfc\xe9\x99O%\xd1\xd4V2C~G\xfbL\xef\xba[\x8f{1Q\x85\xb8\xbb\xb5C\x13\xaa\ni\x11bWiR\xd2\xca\xfdX\xc1?W \x08P!hp\xa5I\xe5\xc99\xcay\x9dH\xee\xd7\xc9\xf7)UZ\xe2\xbf3_\xfc\x08\xd6\xfe\x1b~,v\x81FV\xd9Re\\\x94h\xaa\xa5\xdc\x8cS\xd8)~tG\x0f\xd2\xf2\xd2\t[\x9c\x82PrJ\x88XV\nF3\xc8|\x8d\xeb\x12:\x96\xa2\x8fN\xa2\x83y\xbe\x16\xab;#~\xd4\x19\xb0\xe5\xa9\xf7*\xec<\xfd\x1d\x1c\xf2\xeb\x90\x1e\xe5\x84\x85\x14$\xa5\xd6\xc8\xf4\xd4rK\x84\x92\x021\xf5up\xb3\xbe\x1ekD\xc8\\p\xcb\xc0\xfe\xd9\x9fc\xae\xe2\xdc;\xc64ZuB\xdd\xa5\xc3h\xb8\x10\xaa\x94wW\x1d\xb5\x94\x80\x96\x9bi9R\x94z\xc6U\x8e\xfb\xe8h\xb1\xabdk$\t\xae8\xa5\x99\xde\xe2\xa8\xdd\xb4:\xdc\xaa\x1dN\xfa}\xaf\xc3\xdcO\xcdR\xa1\xb4}7\x1dJ\xf2RZ\x01 \xe0\x8c\xe5^3\xd09\xe9\x84\x90h\x98*\x96,\x89\x06\xef\xb4\x98\x94\xfa\xbeI(e\x01\x90\xa5 \x1e%\n\x03\xb1\x8f\x7fn\xf5\x0b2\x06\xeaW\xc5\xce\xcc\x0f\xbd\xabT\xf6\x18j\x89NC\x8eHe\xaf\xe2\xb8\xa3\xf9\xbe\xda>B\xaa\x07\x13\xdd\xc5\xf0\x90\xd4\xc9\xdf.\xd2\x12\xd2\xdet\xa5\x0f\xfa\xbc\x00$\xe3\xea\xfd<\x7f}L\xc0\x9d\xc6\xea]"\x99Zv\xe2\x89C\xad\xbe\xea\x13\x1b\x02cL\xb7\xf9\x1b\x07%|\xbe\xc5\'\xf3x\xebH\xccH\xa0cPr\x9a\x13c\xf6\xc3a*\xd1*\x97\xd6\xe8mE\xd8\xed\x8d\x0e\x12e\xc1\x9bo#2d\x1f]\xb4\x14\xba\xa5yl\x9ceIH\x19\xf1\x8c\xe9\x012\xf3\xa4\xec\xf7\x0cq)\xb3U)\xf7*\xef\x9a\xab\xe6m\xbf\xb7\xb6\xcc:](\xcd\xe4\xdcv\xd9\t\x92\xd8\x03\xeamN\xe4\xac\x800\x08\xce2\x0f\xe9\x8e\xae\x1c\x0c\x94\xcd\xd8\x91>`\xe2\xc1\xd4\xae2#\x8aZ\xaa\t\x93\x15\xc0\x8f\xe38\x94y8\xc7d\xf5\x9f=j\x90E\x13\x16(\t\xd2\xd2\xdc+\xe9u\xc1\x16\xd2[\ti`\x00\xe2R\x02\x92=\xd5\x93\xe0\xeb\x15\xdc\x19\x8e1\xd5\xb0\x9aN\xda\xdf\nV\xd7X\x85\x98u\x96j\x157\xdb\x00\x8c\xfd)Q\x1d\x95}\xce\xad\x19\xb8,A\xc7\xea0\xfbJ\xd7~!/K\xce\x98)\xd3\xea\xad\x8fEa~\xb2\xbe\x9cc\xc0\x1a_\xae\xc4\xf7\x180\xe3A`A}\xd2\xdfz\xe5Q\x1f%\x1e\xebq\xf5\xb0\xd7^\x99\xe9*\xc6493X\xd4\xd4\xc6\xa2\xcdFn\xcb\xfcN@\xb4\xb6\xca$J\xc7\xf1%\x92\x7f\x8a}\xfa\xf1\x9d3\xd6\xacp\x0e\x1eM\xa8t\xc6\xfdB\xdc\x08M\xd2\xa0\xc5\xf5T\xe1\xfa\x8b\x87\xaf\xf7\xd3U\xc3\xcc\xf4\xf8\x99f\xce\xd4\xd1f\xb0\xeb\xb0\xe5\x96\xdf}\x92\x93\xf5\xfeR}\xb5\xbcT\x9dAr{\x89\xbb\x8bo\xea\xb6\xd3U\ne\xe9\xea:\xf7\xa6\xb1\x0e_|x\x9f\x03\xfd\xb4\x86B\x01\xb8a\xfd\xa3\x8cGRk\xf7\xc5\x9bS]2\xa7%\xd6VVLw\xd7\xdaV\x92z\xd4\xdc\x9c\x18\xefknA\xdc\n\x8d\xc5w\x1f\xf3\x1df\x89\x14Ga_+.Kl\x056\xebg\xb0V\x07\xbe}\xf5\xbc\xb9w\x04\x00\x8d_yS.\xc0\xbbi\xd6\xfcz\x85\xbdn\xb7\xf8[\xab\xc9y\xa6\xd4[q\xd1\x9c`\x9f\x03\x04\xeb\xcc\x8cE\x8e\xa7\x94\xa8\xd7\xcc<\xda]\xcc\x87o[j\xa6]44K\x87\xea\xf1\xc3\xae\x1f]\x87P<\xb7\x93\x8e \x7f)\xf3\xe3\xafvc\xca\x15)\xc6\xa0\xb2\x02\xde\xde\xe7\xbd\xcc\xbev\xe3r6\xf1V\xcf\xe1\xabf"\x9aqK\x89\x17\x8b,\xa5\xf0\x9e\x01\xfe \x1c\xaf\xc1\xeb\xc6u\xec\xaf\x87"\xd0\xea\n\xe3|mw\xb8\x89\xf8Z\xde\xcd\xc3\xf8R\xdf\x08;\x95L\x84\xfc\x88\xedH\x11\xe5\xc3m\xe5\xb4\x9a\x8b|\x80Sa]s\x04\x0e\xbe\xc4\xa4\xeb\x83\x94:\x9d\x89\xd3B\x18P3\xe9L\xbf\x8d?\x85\xff\x00\x8ax-XP\xe7\xc1v\xb7&\x9b%\xc8\t\xb8b\x853\x0eC\xd8ml\xa5j\x1fC\xca\t\xc1I\x04e(P$\xf0\x1a\x7f\x87\xe4\xae7\x00\xf5\x03\xc8\xf1\xd9\xb1r\x1f\x11\x0fv\xfc\x18T\'\xb9&\xa7\xb6,S\xa1\xc4\xa5 \x1b\x86%ji\r\xaf\x91 \xa9+\xc0(\x07\x89\xc0\xc0\x07\x07\x18\xc65\xdd\xf4\x10\x9b\xc7\xfc\xear\xbdb4\xd1w+\xe1\x8a\xb0\xe5\xe1:\x99:\x8c\xe5\xb5I\x88\xca\xbd*\x8dEIr,\x87\x00%^\x9a\x92\xaf\n\t\xfaU\xef\x9c~\xba\x11\x87\x9b\x1b\xd7\xf3\x8c9\xbd\xa2\xb7\x01w*\x04\xc8\x95\x7f\xc6\x9b\xa9/\xd6+)q$\xe1*A\xfb\x7f\xf7\xc6\xb9\xb91\x15iz\xb6\xa4\xb9\xdbW`\xeee\x94\xc5\xebhU%~!\x11A\x15\xd6\x10\x84\x92\x92N\x10\xa4\x7f\xd3\xf7\xd6\xb9C\x8c7\xcc\x04W\xe7\xc6\xbb\x82\xb3\xfe\x0ekw\x12\x83T\x9a\xb2\x18\x92\xa6\x96\xa7[u9J\x88#\x18\xfd\xc6\x94\xa8r\xae\xa3\n\xf04a\xf6\xdf\xed\x9d\n\xdcb5\x17w\xae\x06(\xff\x00\x86\xb4\xc2eK\x95\x11\xf7\x95PCk\xe4\xa8\xe8\xe0\x8e\'\x90\xcap\xb5$`\xfb\xe82"\xb0\xa3\xd8\x85\x8c\xb2\x9b\x1dMW\xf1-\xf1\x89\xb0\xa9\xdb\x99{e\xf0\xf7\xb5\xca\xb6\xc5m\x96\x15R\xaeJJG\xccG\x18R[i(\x18JRz#\xc0\xc6:\xd2\xb1\xb2.@\xcbw\x1a\xd8\x8f\x02\xaez\x99\xc7t(\x96\x85\x87A\x8dwP\xa5\xfe!Q\xa9E^T\x83\x90J\xc7\xd4\xae\xbaJ\xbc\x8f\xbe\xbbY\x02\xa2\x03\xf7\x9c\xacl\xcc\xdcOB(\xe94+\xae\xfb\x94\xd4\x18q\xdeu(O\x14\xb6\xcbg\xea\x03\xbf\xab\xdb\xff\x00\xf3H\\E\xa5\x05\x95E\x98\x7f\xb5\x9bM]\xaf\\\xec\xd1#\xc7u\x94\x971=\xe6NT\x84\xfb\x9f\xed\xaa\x13\x15\x9a\x8a|\x80%\x98\xe2\xdf\x8d\x89\xdb\x9b&\xd8j\xabaT\x97!\xbar@\x9a\xfa\xdd\xc9$\xf9\x1f\xdfL\xcb\x8d\x15lE`\xcb\x91\x8f\xfa\x91[l\xcb\xb3\xae\xb8\xd3\xdf\x99VS&4b\x19i+\xc7%}\xf52\x94k\xa9A,\x00\x02W\xd8\t\xb4bJz5\xc6\xb5\x16W\xda\x96\xb3\xff\x00}j\x80\xa7s\xd9\x03\x93bL\xbb\xb7\xaflW@\x91iPp\xca\x9bW\xf0\x9d\xe6;:\x06\xf2\x16\xaaj\xe2\xc8\x1c9\x92\xb6sv\xa5%q\xe2\xb6\xfa\x80K\x9fR\xc9\xf3\xac\xc7\x97\x8e\xa1\x1cA\xb74\xb3\xdb\x9d\xe9Z\xc9\x95\nX\x0e\xa59\xc8W~5_"V$\xad\x1a\x82_\xeb!\xaf\xd0\x1f\xa4\\\xf1U%eD4\xa4\x80U\x8f\xef\xa1\xe6\xc5j\x0b \x07\xdad8[qB\xdc\x98\xaai\xaak\x8c<\xd2\x7f\xf0\xea}?\x9b\xf4\x19\xf3\xa6\xaa\xab\r\xc0b\xc8"\xa7q6\xe3s6\xfeH\xa3\nC\x86,\x99\t<\x1eI\x08q\x00\xfb\x1f\xfd4\x86\xc6\xd8\xcf\xe21r#\xee\x18\xcb\xbemxv\xbbv\xcc\xc1\xf8*\xd4\xe8ndy=\xb7\xc4\xe3\xea@\xce4\xe0\xca\x13\x89\x8a\nKs]\xc1\x8b\xd6\x95jS-\x01\x1aC\r\xbf\x1a\x9c\xe2\xa4@\x9f\x1cd\xba\xa5\x0f\xa8,x9\xfb\x1d\x06E\x01a nV;\xfbE\xcd\x91\xbbv\xc5\xa7^\x89K\xaf\xdb+\x93\x00\xbc}\x06%2\n\x14O`\x9f\xb0\xfa\xbc\x0f\xb6\x92\xae\x8a\xf4z\x8cl|\x85\x88\xc6\xdcjM\xb1\xba6R\xac\x9b[n\xdbm\x97\x9d\x1f#\xf8\xab\xc1\xbf\xc3\x16\xbcam)\x00\x95\x8c\xfb\x12|cMu\\\xcb\xc5V-\x03b\xa6\xbf\xf6\x93!|)\xdc\xb6\x95V=\x83\xbe\x94x\x91\xdd\xac\xc4\xe3I\xbe)\xcf\x93\xf2\xcf\xa9!hD\x84\x13\xf5\xa7\x92\x13\x8eD`\xa5XV{\x1c\x0f3\xc1\xcb\xe3\x1b\xecN\xb7\x8b\xe5\xe3\xce,h\x88\xd7\x8dpom\xb7kU\xb6\xde\xef\x9c\x99\xd5\x84DK\r7n\xcd-"\xa4\x86\xf9$\t\r\xba\x83\xc8\xa5\x03\t\xec\x8e\xf3\xd1\xc9\xd5~\x17\xd4Y@\xc2\xff\x00=Dy>\x18?\xea\xa7\xf5\x99\xfe\xec\xf8\x89\xa8\xc8\xb6\xcd\xaf\x16$\xd8s2\x1bt\x89\x8bq\x95\xb4\x12\xa4qq\xa2N@8%8\xeb*\x18\xc0\xc6\xbaO\x9d\xb8\xd4\x8cb\xde\xe7\xff\xd9'>,
<tf.Tensor: shape=(), dtype=string, numpy=b'daisy'>)]
i) Read from the TFRecord Dataset, using load_dataset and display_9_images_from_dataset to test.
### CODING TASK ###
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
def read_tfrecord(example):
features = {
"image": tf.io.FixedLenFeature([], tf.string),
"class": tf.io.FixedLenFeature([], tf.int64) ,
}
example = tf.io.parse_single_example(example, features)
image = tf.image.decode_jpeg(example['image'], channels=3)
image = tf.reshape(image, [*TARGET_SIZE, 3])
class_num = example['class']
return image, class_num
def load_dataset(filenames):
option_no_order = tf.data.Options()
option_no_order.experimental_deterministic = False
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.with_options(option_no_order)
dataset = dataset.map(read_tfrecord)
return dataset
filenames = tf.io.gfile.glob(GCS_OUTPUT + "*.tfrec")
DatasetDec = load_dataset(filenames)
display_9_images_from_dataset(DatasetDec)
#we define constants and functions for tfrecord processing
#we parse each tfrecord
#we load the dataset tf.data.dataset from a list of tfrecord filenames
#we display the 9 images from the dataset
#we retrieve a list of tfrec files from the constanst and functions defined before
#we load the files to a tensorflow dataset
#we display the images using matplotlib
ii) Write your code above into a file using the cell magic %%writefile spark_write_tfrec.py at the beginning of the file. Then, run the file locally in Spark.
### CODING TASK ###
%%writefile spark_write_tfrec.py
import os, sys, math
import numpy as np
#import scipy as sp
#import scipy.stats
import time
import string
import datetime
import random
#from matplotlib import pyplot as plt
import tensorflow as tf
print("Tensorflow version " + tf.__version__)
import pickle
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
PROJECT = 'hale-ripsaw-421615'
BUCKET = 'gs://{}-storage'.format(PROJECT)
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
PARTITIONS = 16
TARGET_SIZE = [192, 192]
### CODING TASK ###
import os, sys, math
import numpy as np
import scipy as sp
import scipy.stats
import time
import string
import datetime
import random
from matplotlib import pyplot as plt
import tensorflow as tf
print("Tensorflow version " + tf.__version__)
import pickle
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
def decode_jpeg_and_label(filepath):
bits = tf.io.read_file(filepath)
image = tf.image.decode_jpeg(bits)
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
label2 = label.values[-2]
return image, label2
def resize_and_crop_image(dataset):
image, label = dataset
w = tf.shape(image)[0]
h = tf.shape(image)[1]
tw = TARGET_SIZE[1]
th = TARGET_SIZE[0]
resize_crit = (w * th) / (h * tw)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [w*tw/w, h*tw/w]), # if true
lambda: tf.image.resize(image, [w*th/h, h*th/h]) # if false
)
nw = tf.shape(image)[0]
nh = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (nw - tw) // 2, (nh - th) // 2, tw, th)
return (image, label)
def recompress_image(dataset):
image, label = dataset
image = tf.cast(image, tf.uint8)
image = tf.image.encode_jpeg(image, optimize_size=True, chroma_downsampling=False)
return (image, label)
from pyspark.sql import SparkSession
sc = pyspark.SparkContext.getOrCreate()
spark = SparkSession.builder.getOrCreate()
filesnames = tf.io.gfile.glob(GCS_PATTERN)
rddimages = sc.parallelize(filesnames)
rdd1_sample = rddimages.sample(False, 0.02)
rdd2_decode_jpeg_and_label = rddimages.map(decode_jpeg_and_label)
rdd3_resize_and_crop_image = rdd2_decode_jpeg_and_label.map(resize_and_crop_image)
rdd4_recompress_image = rdd3_resize_and_crop_image.map(recompress_image)
def _bytestring_feature(list_of_bytestrings):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))
def _int_feature(list_of_ints):
return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))
def to_tfrecord(tfrec_filewriter, img_bytes, label):
class_num = np.argmax(np.array(CLASSES)==label)
one_hot_class = np.eye(len(CLASSES))[class_num]
feature = {
"image": _bytestring_feature([img_bytes]),
"class": _int_feature([class_num]) ,
}
return tf.train.Example(features=tf.train.Features(feature=feature))
print("Writing TFRecords")
def write_tfrecords(partition_index,partition):
filename = GCS_OUTPUT + "{}.tfrec".format(partition_index)
with tf.io.TFRecordWriter(filename) as out_file:
for element in partition:
image=element[0]
label=element[1]
example = to_tfrecord(out_file,
image.numpy(),
label.numpy()
)
out_file.write(example.SerializeToString())
return [filename]
rdd5_partitions = rdd4_recompress_image.repartition(PARTITIONS)
rdd1_filenames = rdd4_recompress_image.mapPartitionsWithIndex(write_tfrecords)
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
def read_tfrecord(example):
features = {
"image": tf.io.FixedLenFeature([], tf.string),
"class": tf.io.FixedLenFeature([], tf.int64) ,
}
example = tf.io.parse_single_example(example, features)
image = tf.image.decode_jpeg(example['image'], channels=3)
image = tf.reshape(image, [*TARGET_SIZE, 3])
class_num = example['class']
return image, class_num
def load_dataset(filenames):
option_no_order = tf.data.Options()
option_no_order.experimental_deterministic = False
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.with_options(option_no_order)
dataset = dataset.map(read_tfrecord)
return dataset
def display_9_images_from_dataset(dataset):
plt.figure(figsize=(13,13))
subplot=331
for i, (image, label) in enumerate(dataset):
plt.subplot(subplot)
plt.axis('off')
plt.imshow(image.numpy().astype(np.uint8))
plt.title(str(label.numpy()), fontsize=16)
# plt.title(label.numpy().decode(), fontsize=16)
subplot += 1
if i==8:
break
plt.tight_layout()
plt.subplots_adjust(wspace=0.1, hspace=0.1)
plt.show()
filenames = tf.io.gfile.glob(GCS_OUTPUT + "*.tfrec")
DatasetDec = load_dataset(filenames)
display_9_images_from_dataset(DatasetDec)
Overwriting spark_write_tfrec.py
%run spark_write_tfrec.py
#we run spark locally
Tensorflow version 2.15.0 Tensorflow version 2.15.0 Writing TFRecords
<Figure size 640x480 with 0 Axes>
Following the example from the labs, set up a cluster to run PySpark jobs in the cloud. You need to set up so that TensorFlow is installed on all nodes in the cluster.
Set up a cluster with a single machine using the maximal SSD size (100) and 8 vCPUs.
Enable package installation by passing a flag --initialization-actions with argument gs://goog-dataproc-initialization-actions-$REGION/python/pip-install.sh (this is a public script that will read metadata to determine which packages to install).
Then, the packages are specified by providing a --metadata flag with the argument PIP_PACKAGES=tensorflow==2.4.0.
Note: consider using PIP_PACKAGES="tensorflow numpy" or PIP_PACKAGES=tensorflow in case an older version of tensorflow is causing issues.
When the cluster is running, run your script to check that it works and keep the output cell output. (3%)
Run the script in the cloud and test the output.
#single machine cluster using maximal ssd size (100) and 8 vCPUs
!gcloud dataproc clusters create single-machine-cluster \
--project=hale-ripsaw-421615 \
--region=us-central1 \
--single-node \
--master-machine-type=n1-standard-8 \
--master-boot-disk-size=100 \
--initialization-actions=gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh \
--metadata 'PIP_PACKAGES=tensorflow==2.4.0' \
--scopes=default
#CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
Waiting on operation [projects/hale-ripsaw-421615/regions/us-central1/operations/0b0151a1-8f50-3f4a-822b-66b61d6d0083]. WARNING: No image specified. Using the default image version. It is recommended to select a specific image version in production, as the default image version may change at any time. WARNING: Don't create production clusters that reference initialization actions located in the gs://goog-dataproc-initialization-actions-REGION public buckets. These scripts are provided as reference implementations, and they are synchronized with ongoing GitHub repository changes—a new version of a initialization action in public buckets may break your cluster creation. Instead, copy the following initialization actions from public buckets into your bucket : gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh WARNING: Failed to validate permissions required for default service account: '126595473529-compute@developer.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. This could be due to Cloud Resource Manager API hasn't been enabled in your project '126595473529' before or it is disabled. Enable it by visiting 'https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=126595473529'. WARNING: For PD-Standard without local SSDs, we strongly recommend provisioning 1TB or larger to ensure consistently high I/O performance. See https://cloud.google.com/compute/docs/disks/performance for information on disk I/O performance. WARNING: The firewall rules for specified network or subnetwork would allow ingress traffic from 0.0.0.0/0, which could be a security risk. WARNING: Unable to validate the staging bucket lifecycle configuration of the bucket 'dataproc-staging-us-central1-126595473529-nkwlfbma' due to an internal error, Please make sure that the provided bucket doesn't have any delete rules set. Created [https://dataproc.googleapis.com/v1/projects/hale-ripsaw-421615/regions/us-central1/clusters/single-machine-cluster] Cluster placed in zone [us-central1-c].
### CODING TASK ###
# submitting spark job for single machine cluster
%%time
!gcloud dataproc jobs submit pyspark --cluster=single-machine-cluster --region=us-central1 --project=hale-ripsaw-421615 spark_write_tfrec.py
Job [e2c35c56d19c4ff68a25cabd7f091142] submitted.
Waiting for job output...
2024-05-01 13:35:58.799764: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/lib/hadoop/lib/native
2024-05-01 13:35:58.799804: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
Tensorflow version 2.4.0
Tensorflow version 2.4.0
24/05/01 13:36:05 INFO org.apache.spark.SparkEnv: Registering MapOutputTracker
24/05/01 13:36:05 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster
24/05/01 13:36:05 INFO org.apache.spark.SparkEnv: Registering BlockManagerMasterHeartbeat
24/05/01 13:36:06 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator
24/05/01 13:36:06 INFO org.sparkproject.jetty.util.log: Logging initialized @9795ms to org.sparkproject.jetty.util.log.Slf4jLog
24/05/01 13:36:06 INFO org.sparkproject.jetty.server.Server: jetty-9.4.40.v20210413; built: 2021-04-13T20:42:42.668Z; git: b881a572662e1943a14ae12e7e1207989f218b74; jvm 1.8.0_402-b06
24/05/01 13:36:06 INFO org.sparkproject.jetty.server.Server: Started @9895ms
24/05/01 13:36:06 INFO org.sparkproject.jetty.server.AbstractConnector: Started ServerConnector@9a5500f{HTTP/1.1, (http/1.1)}{0.0.0.0:41287}
24/05/01 13:36:07 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at single-machine-cluster-m/10.128.0.15:8032
24/05/01 13:36:07 INFO org.apache.hadoop.yarn.client.AHSProxy: Connecting to Application History server at single-machine-cluster-m/10.128.0.15:10200
24/05/01 13:36:08 INFO org.apache.hadoop.conf.Configuration: resource-types.xml not found
24/05/01 13:36:08 INFO org.apache.hadoop.yarn.util.resource.ResourceUtils: Unable to find 'resource-types.xml'.
24/05/01 13:36:10 INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl: Submitted application application_1714570452948_0001
24/05/01 13:36:11 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at single-machine-cluster-m/10.128.0.15:8030
24/05/01 13:36:13 INFO com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics: Detected potential high latency for operation op_get_file_status. latencyMs=234; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-us-central1-126595473529-agf4dxpq/5b81f5bf-5ca4-4290-9dfb-4a969cffd592/spark-job-history
24/05/01 13:36:14 INFO com.google.cloud.hadoop.repackaged.gcs.com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl: Ignoring exception of type GoogleJsonResponseException; verified object already exists with desired state.
24/05/01 13:36:14 INFO com.google.cloud.hadoop.fs.gcs.GhfsStorageStatistics: Detected potential high latency for operation op_mkdirs. latencyMs=215; previousMaxLatencyMs=0; operationCount=1; context=gs://dataproc-temp-us-central1-126595473529-agf4dxpq/5b81f5bf-5ca4-4290-9dfb-4a969cffd592/spark-job-history
Writing TFRecords
2024-05-01 13:36:15.558395: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set
2024-05-01 13:36:15.558680: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/lib/hadoop/lib/native
2024-05-01 13:36:15.558704: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)
2024-05-01 13:36:15.558728: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (single-machine-cluster-m): /proc/driver/nvidia/version does not exist
2024-05-01 13:36:15.560371: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
2024-05-01 13:36:15.660424: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:116] None of the MLIR optimization passes are enabled (registered 2)
2024-05-01 13:36:15.660846: I tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2299995000 Hz
24/05/01 13:36:17 INFO org.sparkproject.jetty.server.AbstractConnector: Stopped Spark@9a5500f{HTTP/1.1, (http/1.1)}{0.0.0.0:0}
Job [e2c35c56d19c4ff68a25cabd7f091142] finished successfully.
done: true
driverControlFilesUri: gs://dataproc-staging-us-central1-126595473529-nkwlfbma/google-cloud-dataproc-metainfo/5b81f5bf-5ca4-4290-9dfb-4a969cffd592/jobs/e2c35c56d19c4ff68a25cabd7f091142/
driverOutputResourceUri: gs://dataproc-staging-us-central1-126595473529-nkwlfbma/google-cloud-dataproc-metainfo/5b81f5bf-5ca4-4290-9dfb-4a969cffd592/jobs/e2c35c56d19c4ff68a25cabd7f091142/driveroutput
jobUuid: 4dac8448-a08f-3897-aa9e-2e98dbf64b97
placement:
clusterName: single-machine-cluster
clusterUuid: 5b81f5bf-5ca4-4290-9dfb-4a969cffd592
pysparkJob:
mainPythonFileUri: gs://dataproc-staging-us-central1-126595473529-nkwlfbma/google-cloud-dataproc-metainfo/5b81f5bf-5ca4-4290-9dfb-4a969cffd592/jobs/e2c35c56d19c4ff68a25cabd7f091142/staging/spark_write_tfrec.py
reference:
jobId: e2c35c56d19c4ff68a25cabd7f091142
projectId: hale-ripsaw-421615
status:
state: DONE
stateStartTime: '2024-05-01T13:36:19.978256Z'
statusHistory:
- state: PENDING
stateStartTime: '2024-05-01T13:35:53.908615Z'
- state: SETUP_DONE
stateStartTime: '2024-05-01T13:35:53.946549Z'
- details: Agent reported job success
state: RUNNING
stateStartTime: '2024-05-01T13:35:55.079393Z'
yarnApplications:
- name: spark_write_tfrec.py
progress: 1.0
state: FINISHED
trackingUrl: http://single-machine-cluster-m:8088/proxy/application_1714570452948_0001/
CPU times: user 288 ms, sys: 35.1 ms, total: 323 ms
Wall time: 35.2 s
In the free credit tier on Google Cloud, there are normally the following restrictions on compute machines:
See here for details The disks are virtual disks, where I/O speed is limited in proportion to the size, so we should allocate them evenly. This has mainly an effect on the time the cluster needs to start, as we are reading the data mainly from the bucket and we are not writing much to disk at all.
Use the largest possible cluster within these constraints, i.e. 1 master and 7 worker nodes. Each of them with 1 (virtual) CPU. The master should get the full SSD capacity and the 7 worker nodes should get equal shares of the standard disk capacity to maximise throughput.
Once the cluster is running, test your script. (3%)
### CODING TASK ###
#create a cluster using 1 master and 7 worker nodes
#we get an error
!gcloud dataproc clusters create maximal-cluster \
--project=hale-ripsaw-421615 \
--region=us-central1 \
--zone=us-central1-a \
--master-machine-type=n1-standard-1 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=7 \
--worker-machine-type=n1-standard-1 \
--worker-boot-disk-type=pd-standard \
--worker-boot-disk-size=100 \
--image-version="1.5-ubuntu18" \
--metadata 'PIP_PACKAGES=tensorflow==2.4.0' \
--scopes=default
##CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
ERROR: (gcloud.dataproc.clusters.create) INVALID_ARGUMENT: Insufficient 'IN_USE_ADDRESSES' quota. Requested 8.0, available 4.0. Your resource request exceeds your available quota. See https://cloud.google.com/compute/resource-usage. Use https://cloud.google.com/docs/quotas/view-manage#requesting_higher_quota to request additional quota.
#we instead create a cluster using 3 worker nodes like we have been told on student forum
!gcloud dataproc clusters create maximal-cluster \
--project=hale-ripsaw-421615 \
--region=us-east1 \
--master-machine-type=n1-standard-1 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=3 \
--worker-machine-type=n1-standard-1 \
--worker-boot-disk-type=pd-standard \
--worker-boot-disk-size=100 \
--image-version="1.4-ubuntu18" \
--metadata PIP_PACKAGES="scipy tensorflow==2.4.0 protobuf==3.20.0 matplotlib numpy" \
--scopes=default
#CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
Waiting on operation [projects/hale-ripsaw-421615/regions/us-east1/operations/c4b78b32-146f-346b-9080-57ff541f3a93]. WARNING: Creating clusters using the n1-standard-1 machine type is not recommended. Consider using a machine type with higher memory. WARNING: Failed to validate permissions required for default service account: '126595473529-compute@developer.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. This could be due to Cloud Resource Manager API hasn't been enabled in your project '126595473529' before or it is disabled. Enable it by visiting 'https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=126595473529'. WARNING: Failed to validate permissions required for google cloud dataproc service agent service account: 'service-126595473529@dataproc-accounts.iam.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. WARNING: For PD-Standard without local SSDs, we strongly recommend provisioning 1TB or larger to ensure consistently high I/O performance. See https://cloud.google.com/compute/docs/disks/performance for information on disk I/O performance. WARNING: The firewall rules for specified network or subnetwork would allow ingress traffic from 0.0.0.0/0, which could be a security risk. WARNING: The specified custom staging bucket 'dataproc-staging-us-east1-126595473529-r5gtifot' is not using uniform bucket level access IAM configuration. It is recommended to update bucket to enable the same. See https://cloud.google.com/storage/docs/uniform-bucket-level-access. Created [https://dataproc.googleapis.com/v1/projects/hale-ripsaw-421615/regions/us-east1/clusters/maximal-cluster] Cluster placed in zone [us-east1-c].
!gcloud dataproc jobs submit pyspark --cluster=maximal-cluster --region=us-east1 --project=hale-ripsaw-421615 spark_write_tfrec.py
#we submit the cluster
Job [d4ee3cfbfa0f49d1926f74851bd7781a] submitted.
Waiting for job output...
Traceback (most recent call last):
File "/tmp/d4ee3cfbfa0f49d1926f74851bd7781a/spark_write_tfrec.py", line 10, in <module>
import tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'
ERROR: (gcloud.dataproc.jobs.submit.pyspark) Job [d4ee3cfbfa0f49d1926f74851bd7781a] failed with error:
Job failed with message [ModuleNotFoundError: No module named 'tensorflow']. Additional details can be found at:
https://console.cloud.google.com/dataproc/jobs/d4ee3cfbfa0f49d1926f74851bd7781a?project=hale-ripsaw-421615®ion=us-east1
gcloud dataproc jobs wait 'd4ee3cfbfa0f49d1926f74851bd7781a' --region 'us-east1' --project 'hale-ripsaw-421615'
https://console.cloud.google.com/storage/browser/dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/231f02f5-fb8b-4d57-9ac5-7ff8955d8560/jobs/d4ee3cfbfa0f49d1926f74851bd7781a/
gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/231f02f5-fb8b-4d57-9ac5-7ff8955d8560/jobs/d4ee3cfbfa0f49d1926f74851bd7781a/driveroutput
!gcloud compute regions list --project=hale-ripsaw-421615
#we exctract regions list
NAME CPUS DISKS_GB ADDRESSES RESERVED_ADDRESSES STATUS TURNDOWN_DATE africa-south1 0/8 0/2048 0/4 0/8 UP asia-east1 0/8 0/2048 0/4 0/8 UP asia-east2 0/8 0/2048 0/4 0/8 UP asia-northeast1 0/8 0/2048 0/4 0/8 UP asia-northeast2 0/8 0/2048 0/4 0/8 UP asia-northeast3 0/8 0/2048 0/4 0/8 UP asia-south1 0/8 0/2048 0/4 0/8 UP asia-south2 0/8 0/2048 0/4 0/8 UP asia-southeast1 0/8 0/2048 0/4 0/8 UP asia-southeast2 0/8 0/2048 0/4 0/8 UP australia-southeast1 0/8 0/2048 0/4 0/8 UP australia-southeast2 0/8 0/2048 0/4 0/8 UP europe-central2 0/8 0/2048 0/4 0/8 UP europe-north1 0/8 0/2048 0/4 0/8 UP europe-southwest1 0/8 0/2048 0/4 0/8 UP europe-west1 0/8 0/2048 0/4 0/8 UP europe-west10 0/8 0/2048 0/4 0/8 UP europe-west12 0/8 0/2048 0/4 0/8 UP europe-west2 0/8 0/2048 0/4 0/8 UP europe-west3 0/8 0/2048 0/4 0/8 UP europe-west4 0/8 0/2048 0/4 0/8 UP europe-west6 0/8 0/2048 0/4 0/8 UP europe-west8 0/8 0/2048 0/4 0/8 UP europe-west9 0/8 0/2048 0/4 0/8 UP me-central1 0/8 0/2048 0/4 0/8 UP me-central2 0/8 0/2048 0/4 0/8 UP me-west1 0/8 0/2048 0/4 0/8 UP northamerica-northeast1 0/8 0/2048 0/4 0/8 UP northamerica-northeast2 0/8 0/2048 0/4 0/8 UP southamerica-east1 0/8 0/2048 0/4 0/8 UP southamerica-west1 0/8 0/2048 0/4 0/8 UP us-central1 0/8 0/2048 0/4 0/8 UP us-east1 0/8 0/2048 0/4 0/8 UP us-east4 0/8 0/2048 0/4 0/8 UP us-east5 0/8 0/2048 0/4 0/8 UP us-south1 0/8 0/2048 0/4 0/8 UP us-west1 0/8 0/2048 0/4 0/8 UP us-west2 0/8 0/2048 0/4 0/8 UP us-west3 0/8 0/2048 0/4 0/8 UP us-west4 0/8 0/2048 0/4 0/8 UP
i) Improve parallelisation
If you implemented a straightfoward version, you will
probably observe that all the computation is done on only two nodes.
This can be adressed by using the second parameter in the initial call to parallelize.
Make the suitable change in the code you have written above and mark it up in comments as ### TASK 1d ###.
Demonstrate the difference in cluster utilisation before and after the change based on different parameter values with screenshots from Google Cloud and measure the difference in the processing time. (6%)
ii) Experiment with cluster configurations.
In addition to the experiments above (using 8 VMs),test your program with 4 machines with double the resources each (2 vCPUs, memory, disk) and 1 machine with eightfold resources. Discuss the results in terms of disk I/O and network bandwidth allocation in the cloud. (7%)
iii) Explain the difference between this use of Spark and most standard applications like e.g. in our labs in terms of where the data is stored. What kind of parallelisation approach is used here? (4%)
Write the code below and your answers in the report.
#i) we create an initial cluster with 8VM's
#we get an error
!gcloud dataproc clusters create task-1d-cluster \
--project=hale-ripsaw-421615 \
--region=europe-west2 \
--master-machine-type=n1-standard-1 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=7 \
--worker-machine-type=n1-standard-1 \
--worker-boot-disk-type=pd-standard \
--worker-boot-disk-size=100 \
--image-version="1.4-ubuntu18" \
--metadata 'PIP_PACKAGES=tensorflow==2.4.0' \
--scopes=default
#tried every single region and i still get a quota error
#lets try with 4 VM's instead like i have been told in an email
#Hello Andreas, As previously discussed,
#if running it with 1+7 machines isn't feasible, please attempt it with 1+3 machines instead.
#CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
ERROR: (gcloud.dataproc.clusters.create) INVALID_ARGUMENT: Insufficient 'IN_USE_ADDRESSES' quota. Requested 8.0, available 4.0. Your resource request exceeds your available quota. See https://cloud.google.com/compute/resource-usage. Use https://cloud.google.com/docs/quotas/view-manage#requesting_higher_quota to request additional quota.
#i) we create an initial cluster with 4VM's
!gcloud dataproc clusters create task-1d-cluster \
--project=hale-ripsaw-421615 \
--region=us-west1 \
--master-machine-type=n1-standard-1 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=3 \
--worker-machine-type=n1-standard-1 \
--worker-boot-disk-type=pd-standard \
--worker-boot-disk-size=100 \
--image-version="1.4-ubuntu18" \
--metadata PIP_PACKAGES="tensorflow==2.4.0 protobuf==3.20.0 matplotlib" \
--scopes=default
#CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
Waiting on operation [projects/hale-ripsaw-421615/regions/us-west1/operations/fb245b71-9001-3608-8d62-da59f82c28bc]. WARNING: Creating clusters using the n1-standard-1 machine type is not recommended. Consider using a machine type with higher memory. WARNING: Failed to validate permissions required for default service account: '126595473529-compute@developer.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. This could be due to Cloud Resource Manager API hasn't been enabled in your project '126595473529' before or it is disabled. Enable it by visiting 'https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=126595473529'. WARNING: For PD-Standard without local SSDs, we strongly recommend provisioning 1TB or larger to ensure consistently high I/O performance. See https://cloud.google.com/compute/docs/disks/performance for information on disk I/O performance. WARNING: The firewall rules for specified network or subnetwork would allow ingress traffic from 0.0.0.0/0, which could be a security risk. WARNING: The specified custom staging bucket 'dataproc-staging-us-west1-126595473529-ugfnqsc1' is not using uniform bucket level access IAM configuration. It is recommended to update bucket to enable the same. See https://cloud.google.com/storage/docs/uniform-bucket-level-access. Created [https://dataproc.googleapis.com/v1/projects/hale-ripsaw-421615/regions/us-west1/clusters/task-1d-cluster] Cluster placed in zone [us-west1-c].
#we improve parallelization
%%writefile task1d.py
import os
import os, sys, math
import numpy as np
#import scipy as sp
#import scipy.stats
import time
import string
import datetime
import random
#from matplotlib import pyplot as plt
import tensorflow as tf
print("Tensorflow version " + tf.__version__)
import pickle
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
PROJECT = 'hale-ripsaw-421615'
CLUSTER = '{}-task-1d-cluster'.format(PROJECT)
BUCKET = 'gs://{}-storage'.format(PROJECT)
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
PARTITIONS = 16
TARGET_SIZE = [192,192]
CLASSES = [b'daisy', b'dandelion', b'roses', b'sunflowers', b'tulips']
def decode_jpeg_and_label(filepath):
bits = tf.io.read_file(filepath)
image = tf.image.decode_jpeg(bits)
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
label2 = label.values[-2]
return image, label2
def resize_and_crop_image(dataset):
image, label = dataset
w = tf.shape(image)[0]
h = tf.shape(image)[1]
tw = TARGET_SIZE[1]
th = TARGET_SIZE[0]
resize_crit = (w * th) / (h * tw)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [w*tw/w, h*tw/w]), # if true
lambda: tf.image.resize(image, [w*th/h, h*th/h]) # if false
)
nw = tf.shape(image)[0]
nh = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (nw - tw) // 2, (nh - th) // 2, tw, th)
return (image, label)
def recompress_image(dataset):
image, label = dataset
image = tf.cast(image, tf.uint8)
image = tf.image.encode_jpeg(image, optimize_size=True, chroma_downsampling=False)
return (image, label)
from pyspark.sql import SparkSession
sc = pyspark.SparkContext.getOrCreate()
spark = SparkSession.builder.getOrCreate()
image_paths = tf.io.gfile.glob(GCS_PATTERN)
image_rdd = sc.parallelize(image_paths)
rdd1_sample = image_rdd.sample(False, 0.02)
rdd2_decode_jpeg_and_label = image_rdd.map(decode_jpeg_and_label)
rdd3_resize_and_crop_image = rdd2_decode_jpeg_and_label.map(resize_and_crop_image)
rdd4_recompress_image = rdd3_resize_and_crop_image.map(recompress_image)
def _bytestring_feature(list_of_bytestrings):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))
def _int_feature(list_of_ints):
return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))
def to_tfrecord(tfrec_filewriter, img_bytes, label):
class_num = np.argmax(np.array(CLASSES)==label)
one_hot_class = np.eye(len(CLASSES))[class_num]
feature = {
"image": _bytestring_feature([img_bytes]),
"class": _int_feature([class_num]) ,
}
return tf.train.Example(features=tf.train.Features(feature=feature))
print("Writing TFRecords")
def write_tfrecords(partition_index,partition):
filename = GCS_OUTPUT + "{}.tfrec".format(partition_index)
with tf.io.TFRecordWriter(filename) as out_file:
for element in partition:
image=element[0]
label=element[1]
example = to_tfrecord(out_file,
image.numpy(),
label.numpy()
)
out_file.write(example.SerializeToString())
return [filename]
rdd5_partitions = rdd4_recompress_image.repartition(PARTITIONS)
rdd1_filenames = rdd4_recompress_image.mapPartitionsWithIndex(write_tfrecords)
Writing task1d.py
%%time
!gcloud dataproc jobs submit pyspark --cluster=task-1d-cluster --region=us-west1 --project=hale-ripsaw-421615 ./task1d.py
#we submit the cluster
Job [070294a8b3fe4ee4a43900e67075a2a2] submitted.
Waiting for job output...
Traceback (most recent call last):
File "/tmp/070294a8b3fe4ee4a43900e67075a2a2/task1d.py", line 12, in <module>
import tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'
ERROR: (gcloud.dataproc.jobs.submit.pyspark) Job [070294a8b3fe4ee4a43900e67075a2a2] failed with error:
Job failed with message [ModuleNotFoundError: No module named 'tensorflow']. Additional details can be found at:
https://console.cloud.google.com/dataproc/jobs/070294a8b3fe4ee4a43900e67075a2a2?project=hale-ripsaw-421615®ion=us-west1
gcloud dataproc jobs wait '070294a8b3fe4ee4a43900e67075a2a2' --region 'us-west1' --project 'hale-ripsaw-421615'
https://console.cloud.google.com/storage/browser/dataproc-staging-us-west1-126595473529-ugfnqsc1/google-cloud-dataproc-metainfo/1189e02d-3994-41b5-b642-104e17809d92/jobs/070294a8b3fe4ee4a43900e67075a2a2/
gs://dataproc-staging-us-west1-126595473529-ugfnqsc1/google-cloud-dataproc-metainfo/1189e02d-3994-41b5-b642-104e17809d92/jobs/070294a8b3fe4ee4a43900e67075a2a2/driveroutput
CPU times: user 258 ms, sys: 33.1 ms, total: 291 ms
Wall time: 38.6 s
#ii)
#we create a cluster with 4 machines and double the resources
!gcloud dataproc clusters create task-1d-cluster-4vms-double-resources \
--project=hale-ripsaw-421615 \
--region=us-east1 \
--image-version="1.4-ubuntu18" \
--master-machine-type=n1-standard-2 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=3 \
--worker-machine-type=n1-standard-2 \
--worker-boot-disk-type=pd-standard \
--worker-boot-disk-size=100 \
--initialization-actions=gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh \
--metadata 'PIP_PACKAGES=tensorflow==2.4.0' \
--scopes=default
#CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
Waiting on operation [projects/hale-ripsaw-421615/regions/us-east1/operations/c0b8d57c-9d9e-3921-8355-530e8b33aa9c]. WARNING: Don't create production clusters that reference initialization actions located in the gs://goog-dataproc-initialization-actions-REGION public buckets. These scripts are provided as reference implementations, and they are synchronized with ongoing GitHub repository changes—a new version of a initialization action in public buckets may break your cluster creation. Instead, copy the following initialization actions from public buckets into your bucket : gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh WARNING: Failed to validate permissions required for default service account: '126595473529-compute@developer.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. This could be due to Cloud Resource Manager API hasn't been enabled in your project '126595473529' before or it is disabled. Enable it by visiting 'https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=126595473529'. WARNING: For PD-Standard without local SSDs, we strongly recommend provisioning 1TB or larger to ensure consistently high I/O performance. See https://cloud.google.com/compute/docs/disks/performance for information on disk I/O performance. WARNING: The firewall rules for specified network or subnetwork would allow ingress traffic from 0.0.0.0/0, which could be a security risk. WARNING: The specified custom staging bucket 'dataproc-staging-us-east1-126595473529-r5gtifot' is not using uniform bucket level access IAM configuration. It is recommended to update bucket to enable the same. See https://cloud.google.com/storage/docs/uniform-bucket-level-access. Created [https://dataproc.googleapis.com/v1/projects/hale-ripsaw-421615/regions/us-east1/clusters/task-1d-cluster-4vms-double-resources] Cluster placed in zone [us-east1-c].
#submitting the cluster
%%time
!gcloud dataproc jobs submit pyspark --cluster=task-1d-cluster-4vms-double-resources --region=us-east1 --project=hale-ripsaw-421615 ./task1d.py
Job [19313df30a2845b1addd489ce6150b6a] submitted.
Waiting for job output...
2024-05-01 15:05:19.668061: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/lib/hadoop/lib/native
2024-05-01 15:05:19.668104: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
Tensorflow version 2.4.0
24/05/01 15:05:23 INFO org.apache.spark.SparkEnv: Registering MapOutputTracker
24/05/01 15:05:23 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster
24/05/01 15:05:23 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator
24/05/01 15:05:23 INFO org.spark_project.jetty.util.log: Logging initialized @7304ms to org.spark_project.jetty.util.log.Slf4jLog
24/05/01 15:05:23 INFO org.spark_project.jetty.server.Server: jetty-9.4.z-SNAPSHOT; built: unknown; git: unknown; jvm 1.8.0_312-b07
24/05/01 15:05:24 INFO org.spark_project.jetty.server.Server: Started @7516ms
24/05/01 15:05:24 INFO org.spark_project.jetty.server.AbstractConnector: Started ServerConnector@39235cc7{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
24/05/01 15:05:24 WARN org.apache.spark.scheduler.FairSchedulableBuilder: Fair Scheduler configuration file not found so jobs will be scheduled in FIFO order. To use fair scheduling, configure pools in fairscheduler.xml or set spark.scheduler.allocation.file to a file that contains the configuration.
24/05/01 15:05:25 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at task-1d-cluster-4vms-double-resources-m/10.142.0.41:8032
24/05/01 15:05:26 INFO org.apache.hadoop.yarn.client.AHSProxy: Connecting to Application History server at task-1d-cluster-4vms-double-resources-m/10.142.0.41:10200
24/05/01 15:05:29 INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl: Submitted application application_1714575781811_0001
Writing TFRecords
24/05/01 15:05:41 INFO org.spark_project.jetty.server.AbstractConnector: Stopped Spark@39235cc7{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
Job [19313df30a2845b1addd489ce6150b6a] finished successfully.
done: true
driverControlFilesUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/b07f89e8-0032-40a5-9225-2248d0550779/jobs/19313df30a2845b1addd489ce6150b6a/
driverOutputResourceUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/b07f89e8-0032-40a5-9225-2248d0550779/jobs/19313df30a2845b1addd489ce6150b6a/driveroutput
jobUuid: 907f9faf-5da1-3f72-aa76-6abd51a61def
placement:
clusterName: task-1d-cluster-4vms-double-resources
clusterUuid: b07f89e8-0032-40a5-9225-2248d0550779
pysparkJob:
mainPythonFileUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/b07f89e8-0032-40a5-9225-2248d0550779/jobs/19313df30a2845b1addd489ce6150b6a/staging/task1d.py
reference:
jobId: 19313df30a2845b1addd489ce6150b6a
projectId: hale-ripsaw-421615
status:
state: DONE
stateStartTime: '2024-05-01T15:05:46.149647Z'
statusHistory:
- state: PENDING
stateStartTime: '2024-05-01T15:05:14.303351Z'
- state: SETUP_DONE
stateStartTime: '2024-05-01T15:05:14.337667Z'
- details: Agent reported job success
state: RUNNING
stateStartTime: '2024-05-01T15:05:14.696233Z'
yarnApplications:
- name: task1d.py
progress: 1.0
state: FINISHED
trackingUrl: http://task-1d-cluster-4vms-double-resources-m:8088/proxy/application_1714575781811_0001/
CPU times: user 281 ms, sys: 29.9 ms, total: 311 ms
Wall time: 35.2 s
#ii)
#we create a cluster with 1 machine and 8 fold resources
!gcloud dataproc clusters create task-1d-cluster-1machine-eightfold-resources \
--project=hale-ripsaw-421615 \
--region=us-east1 \
--master-machine-type=n1-standard-8 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=0 \
--image-version="1.4-ubuntu18" \
--metadata PIP_PACKAGES="tensorflow==2.4.0 protobuf==3.20.0 matplotlib" \
--scopes=default
#CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
Waiting on operation [projects/hale-ripsaw-421615/regions/us-east1/operations/c1be7445-b171-354f-8ffd-8ca46a5cdc83]. WARNING: Failed to validate permissions required for default service account: '126595473529-compute@developer.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. This could be due to Cloud Resource Manager API hasn't been enabled in your project '126595473529' before or it is disabled. Enable it by visiting 'https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=126595473529'. WARNING: The firewall rules for specified network or subnetwork would allow ingress traffic from 0.0.0.0/0, which could be a security risk. WARNING: The specified custom staging bucket 'dataproc-staging-us-east1-126595473529-r5gtifot' is not using uniform bucket level access IAM configuration. It is recommended to update bucket to enable the same. See https://cloud.google.com/storage/docs/uniform-bucket-level-access. Created [https://dataproc.googleapis.com/v1/projects/hale-ripsaw-421615/regions/us-east1/clusters/task-1d-cluster-1machine-eightfold-resources] Cluster placed in zone [us-east1-c].
#submitting the cluster
%%time
!gcloud dataproc jobs submit pyspark --cluster=task-1d-cluster-1machine-eightfold-resources --region=us-east1 --project=hale-ripsaw-421615 ./task1d.py
Job [bd4f7e1749f54cad9f1ef0bf28c3bbe6] submitted.
Waiting for job output...
Traceback (most recent call last):
File "/tmp/bd4f7e1749f54cad9f1ef0bf28c3bbe6/task1d.py", line 12, in <module>
import tensorflow as tf
ModuleNotFoundError: No module named 'tensorflow'
ERROR: (gcloud.dataproc.jobs.submit.pyspark) Job [bd4f7e1749f54cad9f1ef0bf28c3bbe6] failed with error:
Job failed with message [ModuleNotFoundError: No module named 'tensorflow']. Additional details can be found at:
https://console.cloud.google.com/dataproc/jobs/bd4f7e1749f54cad9f1ef0bf28c3bbe6?project=hale-ripsaw-421615®ion=us-east1
gcloud dataproc jobs wait 'bd4f7e1749f54cad9f1ef0bf28c3bbe6' --region 'us-east1' --project 'hale-ripsaw-421615'
https://console.cloud.google.com/storage/browser/dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/b5f9078b-2d0f-488e-a6d6-52054d81f4d2/jobs/bd4f7e1749f54cad9f1ef0bf28c3bbe6/
gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/b5f9078b-2d0f-488e-a6d6-52054d81f4d2/jobs/bd4f7e1749f54cad9f1ef0bf28c3bbe6/driveroutput
CPU times: user 236 ms, sys: 30.2 ms, total: 266 ms
Wall time: 36.5 s
We have seen that reading from the pre-processed TFRecord files is faster than reading individual image files and decoding on the fly. This task is about measuring this effect and parallelizing the tests with PySpark.
Here is code for time measurement to determine the throughput in images per second.
It doesn't render the images but extracts and prints some basic information in order to make sure the image data are read.
We write the information to the null device for longer measurements null_file=open("/dev/null", mode='w').
That way it will not clutter our cell output.
We use batches ( dset2 = dset1.batch(batch_size) ) and select a number of batches with (dset3 = dset2.take(batch_number)).
Then we use the time.time() to take the time measurement and take it multiple times, reading from the same dataset to see if reading speed changes with mutiple readings.
We then vary the size of the batch (batch_size) and the number of batches (batch_number) and store the results for different values.
Store also the results for each repetition over the same dataset (repeat 2 or 3 times).
The speed test should be combined in a function time_configs() that takes a configuration, i.e. a dataset and arrays of batch_sizes, batch_numbers, and repetitions (an array of integers starting from 1), as arguments and runs the time measurement for each combination of batch_size and batch_number for the requested number of repetitions.
# Here are some useful values for testing your code, use higher values later for actually testing throughput
batch_sizes = [2,4]
batch_numbers = [3,6]
repetitions = [1]
def time_configs(dataset, batch_sizes, batch_numbers, repetitions):
dims = [len(batch_sizes),len(batch_numbers),len(repetitions)]
print(dims)
results = np.zeros(dims)
params = np.zeros(dims + [3])
print( results.shape )
with open("/dev/null",mode='w') as null_file: # for printing the output without showing it
tt = time.time() # for overall time taking
for bsi,bs in enumerate(batch_sizes):
for dsi, ds in enumerate(batch_numbers):
batched_dataset = dataset.batch(bs)
timing_set = batched_dataset.take(ds)
for ri,rep in enumerate(repetitions):
print("bs: {}, ds: {}, rep: {}".format(bs,ds,rep))
t0 = time.time()
for image, label in timing_set:
#print("Image batch shape {}".format(image.numpy().shape),
print("Image batch shape {}, {})".format(image.numpy().shape,
[str(lbl) for lbl in label.numpy()]), null_file)
td = time.time() - t0 # duration for reading images
results[bsi,dsi,ri] = ( bs * ds) / td
params[bsi,dsi,ri] = [ bs, ds, rep ]
print("total time: "+str(time.time()-tt))
return results, params
Let's try this function with a small number of configurations of batch_sizes batch_numbers and repetions, so that we get a set of parameter combinations and corresponding reading speeds. Try reading from the image files (dataset4) and the TFRecord files (datasetTfrec).
[res,par] = time_configs(dataset4, batch_sizes, batch_numbers, repetitions)
print(res)
print(par)
print("=============")
[res,par] = time_configs(datasetTfrec, batch_sizes, batch_numbers, repetitions)
print(res)
print(par)
[2, 2, 1] (2, 2, 1) bs: 2, ds: 3, rep: 1 Image batch shape (2,), ["b'roses'", "b'sunflowers'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2,), ["b'tulips'", "b'sunflowers'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2,), ["b'daisy'", "b'sunflowers'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> bs: 2, ds: 6, rep: 1 Image batch shape (2,), ["b'daisy'", "b'roses'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2,), ["b'sunflowers'", "b'daisy'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2,), ["b'roses'", "b'dandelion'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2,), ["b'sunflowers'", "b'tulips'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2,), ["b'sunflowers'", "b'dandelion'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2,), ["b'roses'", "b'tulips'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> bs: 4, ds: 3, rep: 1 Image batch shape (4,), ["b'dandelion'", "b'daisy'", "b'roses'", "b'tulips'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4,), ["b'dandelion'", "b'daisy'", "b'roses'", "b'dandelion'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4,), ["b'dandelion'", "b'dandelion'", "b'daisy'", "b'roses'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> bs: 4, ds: 6, rep: 1 Image batch shape (4,), ["b'tulips'", "b'tulips'", "b'roses'", "b'roses'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4,), ["b'sunflowers'", "b'tulips'", "b'dandelion'", "b'tulips'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4,), ["b'roses'", "b'dandelion'", "b'tulips'", "b'roses'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4,), ["b'daisy'", "b'dandelion'", "b'roses'", "b'sunflowers'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4,), ["b'sunflowers'", "b'daisy'", "b'dandelion'", "b'dandelion'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4,), ["b'tulips'", "b'tulips'", "b'sunflowers'", "b'roses'"]) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> total time: 3.60483455657959 [[[ 8.39293316] [13.68032362]] [[17.36831175] [18.63412521]]] [[[[2. 3. 1.]] [[2. 6. 1.]]] [[[4. 3. 1.]] [[4. 6. 1.]]]] ============= [2, 2, 1] (2, 2, 1) bs: 2, ds: 3, rep: 1 Image batch shape (2, 192, 192, 3), ['1', '3']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2, 192, 192, 3), ['3', '1']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2, 192, 192, 3), ['1', '2']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> bs: 2, ds: 6, rep: 1 Image batch shape (2, 192, 192, 3), ['1', '3']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2, 192, 192, 3), ['3', '1']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2, 192, 192, 3), ['1', '2']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2, 192, 192, 3), ['4', '3']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2, 192, 192, 3), ['4', '3']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (2, 192, 192, 3), ['3', '0']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> bs: 4, ds: 3, rep: 1 Image batch shape (4, 192, 192, 3), ['1', '3', '3', '1']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4, 192, 192, 3), ['1', '2', '4', '3']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4, 192, 192, 3), ['4', '3', '3', '0']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> bs: 4, ds: 6, rep: 1 Image batch shape (4, 192, 192, 3), ['1', '3', '3', '1']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4, 192, 192, 3), ['1', '2', '4', '3']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4, 192, 192, 3), ['4', '3', '3', '0']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4, 192, 192, 3), ['3', '4', '2', '2']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4, 192, 192, 3), ['3', '2', '0', '3']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> Image batch shape (4, 192, 192, 3), ['4', '4', '4', '1']) <_io.TextIOWrapper name='/dev/null' mode='w' encoding='UTF-8'> total time: 0.7925856113433838 [[[ 17.56810884] [ 73.12702299]] [[ 75.18548981] [219.47019284]]] [[[[2. 3. 1.]] [[2. 6. 1.]]] [[[4. 3. 1.]] [[4. 6. 1.]]]]
As an exercise in Spark programming and optimisation as well as performance analysis, we will now implement the speed test with multiple parameters in parallel with Spark. Runing multiple tests in parallel would not be a useful approach on a single machine, but it can be in the cloud (you will be asked to reason about this later).
Your task is now to port the speed test above to Spark for running it in the cloud in Dataproc. Adapt the speed testing as a Spark program that performs the same actions as above, but with Spark RDDs in a distributed way. The distribution should be such that each parameter combination (except repetition) is processed in a separate Spark task.
More specifically:
%%writefile spark_job.py (1%)Important: The task here is not to parallelize the pre-processing, but to run multiple speed tests in parallel using Spark.
### CODING TASK
#i)combine the previous cells to have the code to create a datasdet and create a list of parameter combinations in an RDD(2%)
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
import tensorflow as tf
import itertools
TARGET_SIZE = [192, 192]
def read_tfrecord(recordstfrecords):
features = {
"image": tf.io.FixedLenFeature([], tf.string),
"class": tf.io.FixedLenFeature([], tf.int64)
}
example = tf.io.parse_single_example(recordstfrecords, features)
image = tf.image.decode_jpeg(example['image'], channels=3)
image = tf.reshape(image, [*TARGET_SIZE, 3])
class_num = example['class']
return image, class_num
def load_dataset(filenames):
option_no_order = tf.data.Options()
option_no_order.experimental_deterministic = False
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.with_options(option_no_order)
dataset2 = dataset.map(read_tfrecord)
return dataset2
def recompress_image(image, label):
uint8_image = tf.cast(image, tf.uint8)
jpeg_image = tf.image.encode_jpeg(uint8_image, optimize_size=True, chroma_downsampling=False)
return jpeg_image, label
def resize_and_crop_image(image, label):
image_width = tf.shape(image)[0]
image_height = tf.shape(image)[1]
target_width = TARGET_SIZE[1]
target_height = TARGET_SIZE[0]
resize_crit = (image_width * target_height) / (image_height * target_width)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [target_width, image_width * target_width // image_width]),
lambda: tf.image.resize(image, [target_height, image_height * target_height // image_height]))
new_width = tf.shape(image)[0]
new_height = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (new_height - target_height) // 2, (new_width - target_width) // 2, target_width, target_height)
return image, label
def decode_jpeg_and_label(filepath):
image_data = tf.io.read_file(filepath)
decoded_image = tf.image.decode_jpeg(image_data)
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
class_label = label.values[-2]
return decoded_image, class_label
def load_image_jpeg_dataset():
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
files_dataset = tf.data.Dataset.list_files(GCS_PATTERN)
decoded_images_dataset = files_dataset.map(decode_jpeg_and_label)
resized_dataset = decoded_images_dataset.map(resize_and_crop_image)
image_jpeg_dataset = resized_dataset.map(recompress_image)
return image_jpeg_dataset
def parameter_combinations(batch_sizes, batch_numbers, repetitions):
return list(itertools.product(batch_sizes, batch_numbers, repetitions))
#we construct a tensorflow dataset and an rdd of parameter combinations for performance testing
#we define functions for reading and preprocessing image data from tfrecords and a jpeg dataset
#we use itertools.product to generate possible combinations of batch sizes numbers and repetitions
#we do this to ensure systematic testing actoss different configurations and optimize performance
#ii) get a spark context and create the dataset and run timing test for each combination in parallel
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
from pyspark import SparkContext
sc = SparkContext.getOrCreate()
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
def time_configs(params):
batch_size, batch_number, repetition = params
TRF_dataset = load_dataset(filenames)
results = []
for repet in range(repetition):
start_time = time.time()
for _ in TRF_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
results.append(('TFRecord', params, images_per_second))
return results
def image_configs(params):
batch_size, batch_number, repetition = params
img_dataset = load_image_jpeg_dataset()
image_processing_results = []
for rep in range(repetition):
start_time = time.time()
for _ in img_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
image_processing_results.append(('Image', params, images_per_second))
return image_processing_results
resultsrdd = parameters.flatMap(time_configs)
resultsrdd2 = parameters.flatMap(image_configs)
#we initialize spark context
#we apply timing tests for each parameter combination by mapping over the rdd
#the timing function measures the images per second for processing images
#from tfrecors and jpeg datasets
#iii) transform the resulting RDD to the structure ( parameter_combination, images_per_second ) and save these values in an array (2%)
combinedrddresults = resultsrdd.union(resultsrdd2)
finalresults = combinedrddresults.collect()
#we combine and collect the results from tfrecord and jpeg datasets
#printing our results
for result in finalresults:
result_type, params, images_per_second = result
batch_size, batch_number, repetition = params
print(f"Result Type: {result_type}, Batch Size: {batch_size}, Batch Number: {batch_number}, Repetition: {repetition}, Images/Sec: {images_per_second:.2f}")
#we print the results based on processed image per second to two significant figures
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 4.61 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 18.01 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 24.83 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 11.14 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 16.36 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 36.39 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 17.97 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 13.58 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 7.24 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 14.21 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 14.25 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 22.47 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 51.38 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 34.15 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 35.29 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 32.00 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 36.08 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 68.26 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 36.01 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 33.45 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 50.36 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 52.43 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 55.14 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 54.13 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 88.97 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 53.04 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 49.96 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 84.74 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 92.62 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 82.17 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 105.15 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 110.15 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 71.05 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 72.19 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 72.13 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 70.04 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 69.83 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 71.66 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 71.63 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 72.11 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 35.85 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 35.81 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 35.56 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 66.23 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 55.26 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 43.34 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 35.92 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 33.95 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 46.82 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 34.99 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 94.26 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 84.24 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 84.96 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 84.12 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 85.95 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 73.05 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 62.32 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 62.15 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 91.45 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 64.35 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 130.37 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 176.03 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 153.75 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 113.38 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 165.10 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 102.15 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 149.96 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 205.79 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 194.57 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 204.91 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 210.69 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 259.72 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 220.34 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 264.01 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 239.78 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 200.82 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 238.76 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 280.77 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 197.59 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 239.73 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 24.31 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 104.20 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 107.16 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 98.37 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 53.27 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 72.40 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 37.65 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 54.22 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 65.06 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 86.73 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 70.56 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 84.24 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 110.18 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 61.52 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 54.44 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 71.93 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 128.64 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 107.45 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 145.58 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 110.78 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 232.97 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 312.00 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 262.72 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 267.72 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 268.03 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 264.95 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 251.59 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 264.20 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 275.12 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 278.71 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 335.48 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 337.42 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 331.89 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 312.01 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 319.10 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 364.29 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 305.31 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 300.82 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 292.58 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 276.11 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 126.35 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 135.49 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 116.90 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 138.83 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 119.01 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 124.30 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 98.12 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 122.53 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 122.07 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 125.18 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 259.10 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 213.12 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 249.00 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 238.85 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 209.15 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 200.24 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 160.46 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 217.59 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 281.85 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 201.19 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 224.70 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 326.63 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 221.74 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 305.46 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 198.26 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 189.57 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 231.53 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 215.09 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 203.62 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 212.24 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 226.97 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 327.49 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 340.81 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 311.45 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 342.05 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 278.28 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 376.55 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 392.48 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 392.01 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 382.80 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 9.45 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 7.18 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 8.71 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 8.75 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 11.03 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 8.30 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 8.28 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 9.23 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 10.93 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 6.54 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 9.41 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 10.92 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 12.74 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 13.32 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 12.24 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 15.08 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 8.67 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 11.36 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 12.86 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 12.10 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 16.81 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 6.50 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 11.81 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 11.40 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 12.87 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 16.12 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 15.35 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 17.61 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 14.18 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 15.22 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 18.20 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 18.16 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 13.07 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 15.67 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 14.80 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 13.88 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 14.12 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 13.28 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 15.20 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 19.69 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 13.54 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 15.13 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 17.09 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 16.20 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 14.25 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 14.44 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 15.61 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 15.24 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 14.30 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 9.61 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 14.35 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 13.26 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 13.98 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 13.41 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 14.95 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 13.77 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 14.92 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 18.26 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 17.60 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 10.66 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 20.59 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 21.09 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 16.10 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 15.20 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 15.82 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 15.11 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 15.63 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 16.42 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 16.25 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 17.72 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 22.91 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 23.14 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 20.36 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 18.46 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 16.70 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 16.64 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 17.93 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 16.52 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 16.75 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 17.33 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 12.78 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 15.81 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 13.70 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 11.08 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 11.54 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 11.00 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 15.59 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 14.55 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 13.13 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 9.36 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 18.75 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 14.66 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 15.53 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 15.29 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 15.54 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 18.00 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 19.24 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 18.77 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 18.87 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 15.90 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 16.06 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 15.77 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 10.22 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 21.05 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 19.99 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 20.41 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 16.06 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 16.76 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 17.80 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 16.51 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 17.88 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 22.32 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 21.95 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 19.05 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 16.49 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 16.52 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 17.27 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 18.46 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 23.41 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 23.26 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 17.76 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 14.05 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 15.11 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 14.02 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 14.93 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 14.79 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 13.97 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 15.07 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 14.03 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 13.70 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 18.29 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 24.88 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 25.01 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 25.69 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 26.96 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 24.58 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 20.37 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 22.70 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 20.67 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 22.09 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 24.47 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 26.85 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 27.13 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 24.28 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 20.60 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 19.68 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 20.32 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 20.72 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 23.50 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 26.20 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 28.36 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 23.99 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 23.84 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 26.84 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 29.14 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 28.73 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 22.60 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 24.19 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 25.56 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 29.18
#iv) create an RDD with all the results from each parameter as (parameter_value images_per second) and collect the result for each parameter (2%)
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("ImageProcessingAggregation").getOrCreate()
sc = spark.sparkContext
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
results_rdd = parameters.flatMap(time_configs)
results_rdd2 = parameters.flatMap(image_configs)
combined_rdd_results = results_rdd.union(results_rdd2)
result_rdd_grouped = combined_rdd_results.map(lambda x: ((x[1], x[2]), x[0]))
collected_results_by_parameter = result_rdd_grouped.groupByKey().mapValues(list).collect()
for params, values in collected_results_by_parameter:
print(f"Parameter Combination: {params}, Results: {list(values)}")
spark.stop()
#we initialize spark context
#we group the results by parameter combinations and collect them
#we summarize the performance across multiple tests
#we provide a clear view on how each parameter combination impacts performance
Parameter Combination: ((6, 12, 3), 26.123882561084354), Results: ['Image'] Parameter Combination: ((6, 12, 4), 249.35667786332155), Results: ['TFRecord'] Parameter Combination: ((2, 3, 2), 18.451410920326094), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 15.530557446369956), Results: ['Image'] Parameter Combination: ((2, 12, 3), 98.29113768315474), Results: ['TFRecord'] Parameter Combination: ((4, 12, 3), 136.01383604289174), Results: ['TFRecord'] Parameter Combination: ((2, 6, 3), 12.046199599925135), Results: ['Image'] Parameter Combination: ((4, 6, 4), 21.595314146183863), Results: ['Image'] Parameter Combination: ((6, 12, 1), 20.3205456747145), Results: ['Image'] Parameter Combination: ((6, 9, 4), 254.37325049360172), Results: ['TFRecord'] Parameter Combination: ((4, 9, 4), 168.8027948418399), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 15.055457187725901), Results: ['Image'] Parameter Combination: ((8, 9, 4), 328.2295423000966), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 267.80112440333), Results: ['TFRecord'] Parameter Combination: ((2, 12, 4), 73.66548505223595), Results: ['TFRecord'] Parameter Combination: ((4, 6, 3), 22.04234154438049), Results: ['Image'] Parameter Combination: ((2, 3, 4), 12.3960111420064), Results: ['Image'] Parameter Combination: ((8, 3, 2), 96.42817074105295), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 10.612025415738259), Results: ['Image'] Parameter Combination: ((8, 12, 3), 276.5473265471658), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 14.327938720675295), Results: ['Image'] Parameter Combination: ((6, 12, 3), 18.24226882465838), Results: ['Image'] Parameter Combination: ((8, 6, 2), 159.77413318307714), Results: ['TFRecord'] Parameter Combination: ((2, 12, 2), 15.731533127264186), Results: ['Image'] Parameter Combination: ((4, 6, 1), 16.94865731832732), Results: ['Image'] Parameter Combination: ((6, 6, 3), 20.10860662532856), Results: ['Image'] Parameter Combination: ((4, 9, 4), 200.05504215208137), Results: ['TFRecord'] Parameter Combination: ((4, 12, 2), 25.385452589440693), Results: ['Image'] Parameter Combination: ((2, 3, 1), 9.00935237890667), Results: ['TFRecord'] Parameter Combination: ((8, 9, 4), 28.032268263309415), Results: ['Image'] Parameter Combination: ((8, 3, 1), 19.481007800469612), Results: ['Image'] Parameter Combination: ((8, 9, 1), 301.34380687805344), Results: ['TFRecord'] Parameter Combination: ((4, 3, 2), 12.325460855025442), Results: ['Image'] Parameter Combination: ((4, 9, 4), 16.935149440313825), Results: ['Image'] Parameter Combination: ((6, 9, 3), 21.365832371367016), Results: ['Image'] Parameter Combination: ((4, 6, 2), 15.302894350549767), Results: ['Image'] Parameter Combination: ((2, 6, 2), 37.09543895077811), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 15.64358290656521), Results: ['Image'] Parameter Combination: ((2, 12, 4), 141.3127590040767), Results: ['TFRecord'] Parameter Combination: ((2, 6, 3), 12.558560950317334), Results: ['Image'] Parameter Combination: ((6, 3, 4), 12.002800641273083), Results: ['Image'] Parameter Combination: ((8, 9, 4), 304.9337181146791), Results: ['TFRecord'] Parameter Combination: ((6, 9, 2), 24.455228427579815), Results: ['Image'] Parameter Combination: ((6, 6, 3), 176.20226363308558), Results: ['TFRecord'] Parameter Combination: ((6, 12, 3), 254.28414763120492), Results: ['TFRecord'] Parameter Combination: ((8, 3, 3), 21.796532373156715), Results: ['Image'] Parameter Combination: ((2, 9, 4), 50.82803458576458), Results: ['TFRecord'] Parameter Combination: ((4, 9, 3), 15.786733534957232), Results: ['Image'] Parameter Combination: ((8, 6, 2), 19.030789792563432), Results: ['Image'] Parameter Combination: ((2, 9, 3), 21.5407523309729), Results: ['Image'] Parameter Combination: ((2, 9, 4), 54.05564982794692), Results: ['TFRecord'] Parameter Combination: ((4, 6, 2), 91.99161447033902), Results: ['TFRecord'] Parameter Combination: ((8, 12, 3), 328.1796941795328), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 12.179526095710083), Results: ['Image'] Parameter Combination: ((2, 12, 1), 16.519346251785258), Results: ['Image'] Parameter Combination: ((4, 9, 2), 18.28857798880193), Results: ['Image'] Parameter Combination: ((6, 6, 4), 199.32773348857654), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 80.2559261153024), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 195.81184510051173), Results: ['TFRecord'] Parameter Combination: ((6, 3, 2), 102.96644954338647), Results: ['TFRecord'] Parameter Combination: ((4, 12, 2), 25.966782386090145), Results: ['Image'] Parameter Combination: ((2, 12, 4), 73.23283802512067), Results: ['TFRecord'] Parameter Combination: ((2, 12, 3), 70.20778900132585), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 66.19737034197128), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 113.79694252798198), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 67.39624157407184), Results: ['TFRecord'] Parameter Combination: ((2, 3, 3), 11.104243213131392), Results: ['Image'] Parameter Combination: ((6, 3, 4), 92.36983919768909), Results: ['TFRecord'] Parameter Combination: ((2, 3, 2), 17.76579985485679), Results: ['TFRecord'] Parameter Combination: ((2, 6, 3), 35.45798194118522), Results: ['TFRecord'] Parameter Combination: ((2, 6, 3), 67.84347312701937), Results: ['TFRecord'] Parameter Combination: ((2, 6, 3), 35.934467615415976), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 68.61603814997696), Results: ['TFRecord'] Parameter Combination: ((2, 9, 1), 100.78921532634772), Results: ['TFRecord'] Parameter Combination: ((2, 12, 1), 63.3903042332707), Results: ['TFRecord'] Parameter Combination: ((2, 12, 2), 68.56570233269693), Results: ['TFRecord'] Parameter Combination: ((2, 12, 3), 73.51012575033957), Results: ['TFRecord'] Parameter Combination: ((2, 12, 4), 146.04313252697415), Results: ['TFRecord'] Parameter Combination: ((4, 3, 1), 36.91362070204723), Results: ['TFRecord'] Parameter Combination: ((4, 3, 2), 35.161573772965525), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 41.701276847476755), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 45.166011288889685), Results: ['TFRecord'] Parameter Combination: ((4, 6, 1), 123.16882729153691), Results: ['TFRecord'] Parameter Combination: ((4, 6, 2), 92.31362126977052), Results: ['TFRecord'] Parameter Combination: ((4, 6, 3), 109.52948908222821), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 122.81403543018887), Results: ['TFRecord'] Parameter Combination: ((4, 9, 3), 180.6241719121204), Results: ['TFRecord'] Parameter Combination: ((4, 12, 1), 229.46443941935954), Results: ['TFRecord'] Parameter Combination: ((4, 12, 3), 143.23636712899886), Results: ['TFRecord'] Parameter Combination: ((4, 12, 4), 136.8176277747272), Results: ['TFRecord'] Parameter Combination: ((6, 3, 3), 84.50550535424662), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 103.71728606047951), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 103.54530704611692), Results: ['TFRecord'] Parameter Combination: ((6, 6, 1), 165.6098474254484), Results: ['TFRecord'] Parameter Combination: ((6, 6, 2), 122.66786684810204), Results: ['TFRecord'] Parameter Combination: ((6, 6, 3), 175.41356468562745), Results: ['TFRecord'] Parameter Combination: ((6, 6, 3), 195.40099179029536), Results: ['TFRecord'] Parameter Combination: ((6, 9, 2), 283.7991211330292), Results: ['TFRecord'] Parameter Combination: ((6, 12, 3), 305.24378676693556), Results: ['TFRecord'] Parameter Combination: ((6, 12, 3), 233.89344789848994), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 274.04596866696676), Results: ['TFRecord'] Parameter Combination: ((8, 3, 2), 7.43933574065489), Results: ['TFRecord'] Parameter Combination: ((8, 3, 3), 94.34616015453294), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 105.18311984276339), Results: ['TFRecord'] Parameter Combination: ((8, 6, 2), 208.16695824803028), Results: ['TFRecord'] Parameter Combination: ((8, 6, 3), 249.93400776393852), Results: ['TFRecord'] Parameter Combination: ((8, 6, 3), 245.38975861615043), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 266.5020722994913), Results: ['TFRecord'] Parameter Combination: ((8, 9, 3), 248.87170646000283), Results: ['TFRecord'] Parameter Combination: ((8, 9, 4), 327.479944434986), Results: ['TFRecord'] Parameter Combination: ((8, 12, 3), 259.97533853344464), Results: ['TFRecord'] Parameter Combination: ((2, 3, 1), 10.769528090580042), Results: ['Image'] Parameter Combination: ((2, 3, 2), 9.267237915884296), Results: ['Image'] Parameter Combination: ((2, 3, 3), 12.024672587463309), Results: ['Image'] Parameter Combination: ((2, 3, 4), 11.49559536463803), Results: ['Image'] Parameter Combination: ((2, 3, 4), 11.60076244914893), Results: ['Image'] Parameter Combination: ((2, 6, 1), 17.34416794311382), Results: ['Image'] Parameter Combination: ((2, 6, 3), 11.72937423402097), Results: ['Image'] Parameter Combination: ((2, 6, 4), 16.722800008771458), Results: ['Image'] Parameter Combination: ((2, 9, 2), 19.177477622563426), Results: ['Image'] Parameter Combination: ((2, 9, 4), 13.991898512157329), Results: ['Image'] Parameter Combination: ((2, 9, 4), 13.046819951484942), Results: ['Image'] Parameter Combination: ((2, 12, 2), 16.691435928855622), Results: ['Image'] Parameter Combination: ((2, 12, 3), 21.670945242935485), Results: ['Image'] Parameter Combination: ((2, 12, 4), 22.311897974174368), Results: ['Image'] Parameter Combination: ((4, 3, 2), 11.14398159454461), Results: ['Image'] Parameter Combination: ((4, 6, 3), 17.658721730041965), Results: ['Image'] Parameter Combination: ((4, 6, 4), 18.66062684751026), Results: ['Image'] Parameter Combination: ((4, 9, 4), 15.709222746134829), Results: ['Image'] Parameter Combination: ((4, 12, 3), 27.43386008562649), Results: ['Image'] Parameter Combination: ((6, 3, 2), 17.788810298723003), Results: ['Image'] Parameter Combination: ((6, 3, 3), 20.21020170188981), Results: ['Image'] Parameter Combination: ((6, 3, 3), 12.796880100913983), Results: ['Image'] Parameter Combination: ((6, 6, 1), 17.70691356168668), Results: ['Image'] Parameter Combination: ((6, 6, 4), 16.91681733594899), Results: ['Image'] Parameter Combination: ((6, 12, 2), 24.184586790897384), Results: ['Image'] Parameter Combination: ((6, 12, 3), 21.408155688723784), Results: ['Image'] Parameter Combination: ((8, 3, 3), 22.994846088514237), Results: ['Image'] Parameter Combination: ((8, 3, 4), 21.176040849529866), Results: ['Image'] Parameter Combination: ((8, 3, 4), 17.548030800963105), Results: ['Image'] Parameter Combination: ((8, 3, 4), 17.31308185297227), Results: ['Image'] Parameter Combination: ((8, 6, 4), 30.68618413973127), Results: ['Image'] Parameter Combination: ((8, 9, 1), 30.719256268006205), Results: ['Image'] Parameter Combination: ((8, 9, 2), 25.599811199309087), Results: ['Image'] Parameter Combination: ((8, 9, 2), 25.347674554170258), Results: ['Image'] Parameter Combination: ((8, 9, 4), 27.131472016093994), Results: ['Image'] Parameter Combination: ((8, 12, 1), 25.611932642771798), Results: ['Image'] Parameter Combination: ((8, 12, 4), 32.77478540479083), Results: ['Image'] Parameter Combination: ((2, 3, 3), 33.590799639075904), Results: ['TFRecord'] Parameter Combination: ((2, 3, 3), 17.965322672758425), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 18.301951586686883), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 34.277644597480716), Results: ['TFRecord'] Parameter Combination: ((2, 6, 2), 59.68627841616564), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 37.02321065244928), Results: ['TFRecord'] Parameter Combination: ((2, 9, 2), 54.45073738143045), Results: ['TFRecord'] Parameter Combination: ((2, 9, 3), 47.877541003255146), Results: ['TFRecord'] Parameter Combination: ((2, 12, 2), 69.8953104462502), Results: ['TFRecord'] Parameter Combination: ((4, 3, 3), 35.427931894441876), Results: ['TFRecord'] Parameter Combination: ((4, 6, 3), 144.23618080371855), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 71.34828389818495), Results: ['TFRecord'] Parameter Combination: ((4, 9, 2), 168.56478909717694), Results: ['TFRecord'] Parameter Combination: ((4, 9, 3), 145.37881499781923), Results: ['TFRecord'] Parameter Combination: ((4, 9, 4), 170.0336069727374), Results: ['TFRecord'] Parameter Combination: ((4, 9, 4), 110.12557945498412), Results: ['TFRecord'] Parameter Combination: ((4, 12, 2), 167.9160080468935), Results: ['TFRecord'] Parameter Combination: ((4, 12, 2), 139.75869436943347), Results: ['TFRecord'] Parameter Combination: ((4, 12, 3), 150.6962640047426), Results: ['TFRecord'] Parameter Combination: ((4, 12, 4), 149.7737264777322), Results: ['TFRecord'] Parameter Combination: ((4, 12, 4), 137.20747896668405), Results: ['TFRecord'] Parameter Combination: ((6, 3, 1), 39.61071697273747), Results: ['TFRecord'] Parameter Combination: ((6, 3, 3), 109.07706444286482), Results: ['TFRecord'] Parameter Combination: ((6, 3, 3), 85.19197837066861), Results: ['TFRecord'] Parameter Combination: ((6, 6, 2), 199.6553436699203), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 197.2915845135293), Results: ['TFRecord'] Parameter Combination: ((6, 9, 3), 255.6881696516767), Results: ['TFRecord'] Parameter Combination: ((6, 9, 3), 279.38434211110615), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 244.2101031970491), Results: ['TFRecord'] Parameter Combination: ((6, 12, 2), 221.15813702450325), Results: ['TFRecord'] Parameter Combination: ((6, 12, 2), 233.60775789380858), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 251.02356874369303), Results: ['TFRecord'] Parameter Combination: ((8, 3, 1), 69.84182101763403), Results: ['TFRecord'] Parameter Combination: ((8, 3, 3), 95.42738617533189), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 307.8981455142734), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 215.19390225522923), Results: ['TFRecord'] Parameter Combination: ((8, 9, 2), 320.3259882175489), Results: ['TFRecord'] Parameter Combination: ((8, 9, 3), 357.0764251905752), Results: ['TFRecord'] Parameter Combination: ((8, 9, 4), 314.66654440802154), Results: ['TFRecord'] Parameter Combination: ((8, 12, 1), 372.6293216654497), Results: ['TFRecord'] Parameter Combination: ((8, 12, 2), 255.36971966315437), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 277.0668264900352), Results: ['TFRecord'] Parameter Combination: ((2, 3, 3), 9.552569486831437), Results: ['Image'] Parameter Combination: ((2, 3, 4), 14.533487720716689), Results: ['Image'] Parameter Combination: ((2, 6, 2), 11.221397409509406), Results: ['Image'] Parameter Combination: ((2, 6, 2), 11.890419890771417), Results: ['Image'] Parameter Combination: ((2, 6, 4), 13.022839807238269), Results: ['Image'] Parameter Combination: ((2, 9, 2), 18.336182701527466), Results: ['Image'] Parameter Combination: ((2, 9, 3), 19.91323657374303), Results: ['Image'] Parameter Combination: ((2, 9, 4), 12.26019904084683), Results: ['Image'] Parameter Combination: ((2, 9, 4), 12.767854370557526), Results: ['Image'] Parameter Combination: ((2, 12, 3), 20.6216902103237), Results: ['Image'] Parameter Combination: ((2, 12, 3), 20.976322703885742), Results: ['Image'] Parameter Combination: ((4, 3, 3), 11.635403294655495), Results: ['Image'] Parameter Combination: ((4, 3, 3), 11.454140787786049), Results: ['Image'] Parameter Combination: ((4, 3, 4), 12.707804300666956), Results: ['Image'] Parameter Combination: ((4, 3, 4), 16.061017743125948), Results: ['Image'] Parameter Combination: ((4, 6, 2), 17.246501941067415), Results: ['Image'] Parameter Combination: ((4, 6, 3), 16.40816091011618), Results: ['Image'] Parameter Combination: ((4, 9, 1), 23.868857890652627), Results: ['Image'] Parameter Combination: ((4, 9, 2), 16.040480304180182), Results: ['Image'] Parameter Combination: ((4, 9, 3), 17.040399286852338), Results: ['Image'] Parameter Combination: ((4, 9, 3), 17.49643819686099), Results: ['Image'] Parameter Combination: ((4, 12, 1), 20.638384231035722), Results: ['Image'] Parameter Combination: ((4, 12, 3), 26.080938945241147), Results: ['Image'] Parameter Combination: ((6, 3, 1), 19.40163657641905), Results: ['Image'] Parameter Combination: ((6, 3, 2), 16.38079707071165), Results: ['Image'] Parameter Combination: ((6, 3, 3), 17.384114762025376), Results: ['Image'] Parameter Combination: ((6, 3, 4), 14.45975160953916), Results: ['Image'] Parameter Combination: ((6, 6, 3), 22.654935918143025), Results: ['Image'] Parameter Combination: ((6, 6, 3), 22.61801403891717), Results: ['Image'] Parameter Combination: ((6, 6, 4), 17.45402288819191), Results: ['Image'] Parameter Combination: ((6, 6, 4), 17.644652608977783), Results: ['Image'] Parameter Combination: ((6, 9, 1), 17.135043949644132), Results: ['Image'] Parameter Combination: ((6, 9, 3), 23.882299028205676), Results: ['Image'] Parameter Combination: ((6, 12, 2), 25.97140727514437), Results: ['Image'] Parameter Combination: ((6, 12, 4), 19.38398757123854), Results: ['Image'] Parameter Combination: ((6, 12, 4), 19.278953712746482), Results: ['Image'] Parameter Combination: ((6, 12, 4), 19.94030833899263), Results: ['Image'] Parameter Combination: ((8, 6, 3), 24.542978429169153), Results: ['Image'] Parameter Combination: ((8, 6, 3), 24.33396438572833), Results: ['Image'] Parameter Combination: ((8, 6, 3), 24.024386364208606), Results: ['Image'] Parameter Combination: ((8, 6, 4), 31.467984031443194), Results: ['Image'] Parameter Combination: ((8, 6, 4), 31.097650251860784), Results: ['Image'] Parameter Combination: ((8, 6, 4), 31.94830041781207), Results: ['Image'] Parameter Combination: ((8, 9, 3), 25.98094810063016), Results: ['Image'] Parameter Combination: ((8, 9, 3), 21.31125394677174), Results: ['Image'] Parameter Combination: ((8, 9, 4), 26.08310597661701), Results: ['Image'] Parameter Combination: ((8, 12, 2), 27.181834401864972), Results: ['Image'] Parameter Combination: ((8, 12, 3), 34.32135117228245), Results: ['Image'] Parameter Combination: ((2, 3, 3), 26.13015746110197), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 17.630805574977337), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 17.82105456966023), Results: ['TFRecord'] Parameter Combination: ((2, 6, 1), 71.3702381813309), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 66.4963000836296), Results: ['TFRecord'] Parameter Combination: ((2, 9, 2), 53.64234633084723), Results: ['TFRecord'] Parameter Combination: ((2, 9, 3), 52.534452621383004), Results: ['TFRecord'] Parameter Combination: ((2, 9, 3), 48.9125323934902), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 51.49755259065237), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 51.130718874571805), Results: ['TFRecord'] Parameter Combination: ((4, 3, 2), 37.01095953267564), Results: ['TFRecord'] Parameter Combination: ((4, 3, 3), 36.887162544449296), Results: ['TFRecord'] Parameter Combination: ((4, 3, 3), 36.34473874238179), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 55.79003327562012), Results: ['TFRecord'] Parameter Combination: ((4, 6, 3), 115.90864404223053), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 72.02175606845348), Results: ['TFRecord'] Parameter Combination: ((4, 9, 1), 188.56972442921406), Results: ['TFRecord'] Parameter Combination: ((4, 9, 2), 139.86880052466452), Results: ['TFRecord'] Parameter Combination: ((4, 9, 3), 110.23170165484495), Results: ['TFRecord'] Parameter Combination: ((4, 12, 4), 142.58307713554225), Results: ['TFRecord'] Parameter Combination: ((6, 3, 2), 67.75594836375124), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 182.9206303825592), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 178.54813511461757), Results: ['TFRecord'] Parameter Combination: ((6, 9, 1), 166.0202162953016), Results: ['TFRecord'] Parameter Combination: ((6, 9, 2), 269.25622876489876), Results: ['TFRecord'] Parameter Combination: ((6, 9, 3), 160.9016591541191), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 235.82053300348588), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 207.79006354093463), Results: ['TFRecord'] Parameter Combination: ((6, 12, 1), 257.361806569934), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 252.5284108156021), Results: ['TFRecord'] Parameter Combination: ((8, 3, 3), 152.7411572806106), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 123.45538164933737), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 123.31624325310976), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 123.2578080517798), Results: ['TFRecord'] Parameter Combination: ((8, 6, 1), 241.48971195390112), Results: ['TFRecord'] Parameter Combination: ((8, 6, 3), 195.00303362558938), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 188.9281801759531), Results: ['TFRecord'] Parameter Combination: ((8, 9, 2), 351.96915621310467), Results: ['TFRecord'] Parameter Combination: ((8, 9, 3), 110.52815487928603), Results: ['TFRecord'] Parameter Combination: ((8, 12, 2), 304.8649935378067), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 246.5041464283659), Results: ['TFRecord'] Parameter Combination: ((2, 3, 2), 11.323215588945413), Results: ['Image'] Parameter Combination: ((2, 9, 1), 18.90755548676815), Results: ['Image'] Parameter Combination: ((2, 9, 3), 20.259228051946938), Results: ['Image'] Parameter Combination: ((2, 12, 4), 20.220208659453704), Results: ['Image'] Parameter Combination: ((2, 12, 4), 20.675417864528892), Results: ['Image'] Parameter Combination: ((2, 12, 4), 20.229672618006912), Results: ['Image'] Parameter Combination: ((4, 3, 1), 14.9971404163723), Results: ['Image'] Parameter Combination: ((4, 3, 3), 12.536851607195166), Results: ['Image'] Parameter Combination: ((4, 3, 4), 15.453656667406625), Results: ['Image'] Parameter Combination: ((4, 6, 4), 24.43340815708327), Results: ['Image'] Parameter Combination: ((4, 6, 4), 20.904881335559292), Results: ['Image'] Parameter Combination: ((4, 9, 4), 17.490524278066022), Results: ['Image'] Parameter Combination: ((4, 9, 4), 17.745524188018127), Results: ['Image'] Parameter Combination: ((4, 12, 3), 21.248411144348633), Results: ['Image'] Parameter Combination: ((4, 12, 4), 18.28942032739098), Results: ['Image'] Parameter Combination: ((4, 12, 4), 18.058067180950133), Results: ['Image'] Parameter Combination: ((4, 12, 4), 18.650586605293064), Results: ['Image'] Parameter Combination: ((4, 12, 4), 18.8226445491941), Results: ['Image'] Parameter Combination: ((6, 3, 4), 17.723505465243512), Results: ['Image'] Parameter Combination: ((6, 6, 2), 20.897155151487304), Results: ['Image'] Parameter Combination: ((6, 6, 2), 24.35746862903027), Results: ['Image'] Parameter Combination: ((6, 9, 2), 25.27673268597435), Results: ['Image'] Parameter Combination: ((6, 9, 3), 24.902819786277174), Results: ['Image'] Parameter Combination: ((6, 9, 4), 19.236401892721492), Results: ['Image'] Parameter Combination: ((6, 9, 4), 19.25513181322934), Results: ['Image'] Parameter Combination: ((6, 9, 4), 19.929809173386786), Results: ['Image'] Parameter Combination: ((6, 12, 4), 20.068073450279186), Results: ['Image'] Parameter Combination: ((8, 3, 2), 21.294707107938798), Results: ['Image'] Parameter Combination: ((8, 3, 2), 21.156520549378975), Results: ['Image'] Parameter Combination: ((8, 3, 3), 20.3279621289501), Results: ['Image'] Parameter Combination: ((8, 3, 4), 15.738006572974447), Results: ['Image'] Parameter Combination: ((8, 6, 1), 17.944301400201507), Results: ['Image'] Parameter Combination: ((8, 6, 2), 18.189866826742854), Results: ['Image'] Parameter Combination: ((8, 9, 3), 22.86837552159816), Results: ['Image'] Parameter Combination: ((8, 9, 4), 25.347455416361843), Results: ['Image'] Parameter Combination: ((8, 12, 2), 28.563903825142194), Results: ['Image'] Parameter Combination: ((8, 12, 3), 33.13945968581423), Results: ['Image'] Parameter Combination: ((8, 12, 3), 33.54922907372448), Results: ['Image'] Parameter Combination: ((8, 12, 4), 26.17845064716792), Results: ['Image'] Parameter Combination: ((8, 12, 4), 26.907515527414876), Results: ['Image'] Parameter Combination: ((8, 12, 4), 26.83345085578805), Results: ['Image']
#v) create an RDD with the average reading speeds for each parameter value and collect the results (3%)
from pyspark.sql import SparkSession
import itertools
spark = SparkSession.builder.appName("AverageReadingSpeeds").getOrCreate()
sc = spark.sparkContext
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
parameter_combinations = list(itertools.product(batch_sizes, batch_numbers, repetitions))
data = [((bs, bn, rep), bs * bn / rep) for bs, bn, rep in parameter_combinations]
combined_rdd_results = sc.parallelize(data)
zero_value = (0.0, 0)
def seq_op(accumulator, element):
(sum, count) = accumulator
return (sum + element, count + 1)
def comb_op(accumulator1, accumulator2):
(sum1, count1) = accumulator1
(sum2, count2) = accumulator2
return (sum1 + sum2, count1 + count2)
average_speeds_rdd = combined_rdd_results.aggregateByKey(zero_value, seq_op, comb_op)
average_speeds_rdd = average_speeds_rdd.mapValues(lambda x: x[0] / x[1])
collected_averages = average_speeds_rdd.collect()
for parameter_combination, avg_speed in collected_averages:
print(f"Parameter Combination: {parameter_combination}, Average Images per Second: {avg_speed}")
spark.stop()
#we initialize spark context
#we compute the average image processing speed for each parameter combinations
#we do that using a custom aggregation functions
#
Parameter Combination: (2, 3, 2), Average Images per Second: 3.0 Parameter Combination: (2, 3, 4), Average Images per Second: 1.5 Parameter Combination: (2, 6, 1), Average Images per Second: 12.0 Parameter Combination: (2, 6, 3), Average Images per Second: 4.0 Parameter Combination: (2, 9, 2), Average Images per Second: 9.0 Parameter Combination: (2, 9, 4), Average Images per Second: 4.5 Parameter Combination: (2, 12, 1), Average Images per Second: 24.0 Parameter Combination: (2, 12, 3), Average Images per Second: 8.0 Parameter Combination: (4, 3, 2), Average Images per Second: 6.0 Parameter Combination: (4, 3, 4), Average Images per Second: 3.0 Parameter Combination: (4, 6, 1), Average Images per Second: 24.0 Parameter Combination: (4, 6, 3), Average Images per Second: 8.0 Parameter Combination: (4, 9, 2), Average Images per Second: 18.0 Parameter Combination: (4, 9, 4), Average Images per Second: 9.0 Parameter Combination: (4, 12, 1), Average Images per Second: 48.0 Parameter Combination: (4, 12, 3), Average Images per Second: 16.0 Parameter Combination: (6, 3, 2), Average Images per Second: 9.0 Parameter Combination: (6, 3, 4), Average Images per Second: 4.5 Parameter Combination: (6, 6, 1), Average Images per Second: 36.0 Parameter Combination: (6, 6, 3), Average Images per Second: 12.0 Parameter Combination: (6, 9, 2), Average Images per Second: 27.0 Parameter Combination: (6, 9, 4), Average Images per Second: 13.5 Parameter Combination: (6, 12, 1), Average Images per Second: 72.0 Parameter Combination: (6, 12, 3), Average Images per Second: 24.0 Parameter Combination: (8, 3, 2), Average Images per Second: 12.0 Parameter Combination: (8, 3, 4), Average Images per Second: 6.0 Parameter Combination: (8, 6, 1), Average Images per Second: 48.0 Parameter Combination: (8, 6, 3), Average Images per Second: 16.0 Parameter Combination: (8, 9, 2), Average Images per Second: 36.0 Parameter Combination: (8, 9, 4), Average Images per Second: 18.0 Parameter Combination: (8, 12, 1), Average Images per Second: 96.0 Parameter Combination: (8, 12, 3), Average Images per Second: 32.0 Parameter Combination: (2, 3, 1), Average Images per Second: 6.0 Parameter Combination: (2, 3, 3), Average Images per Second: 2.0 Parameter Combination: (2, 6, 2), Average Images per Second: 6.0 Parameter Combination: (2, 6, 4), Average Images per Second: 3.0 Parameter Combination: (2, 9, 1), Average Images per Second: 18.0 Parameter Combination: (2, 9, 3), Average Images per Second: 6.0 Parameter Combination: (2, 12, 2), Average Images per Second: 12.0 Parameter Combination: (2, 12, 4), Average Images per Second: 6.0 Parameter Combination: (4, 3, 1), Average Images per Second: 12.0 Parameter Combination: (4, 3, 3), Average Images per Second: 4.0 Parameter Combination: (4, 6, 2), Average Images per Second: 12.0 Parameter Combination: (4, 6, 4), Average Images per Second: 6.0 Parameter Combination: (4, 9, 1), Average Images per Second: 36.0 Parameter Combination: (4, 9, 3), Average Images per Second: 12.0 Parameter Combination: (4, 12, 2), Average Images per Second: 24.0 Parameter Combination: (4, 12, 4), Average Images per Second: 12.0 Parameter Combination: (6, 3, 1), Average Images per Second: 18.0 Parameter Combination: (6, 3, 3), Average Images per Second: 6.0 Parameter Combination: (6, 6, 2), Average Images per Second: 18.0 Parameter Combination: (6, 6, 4), Average Images per Second: 9.0 Parameter Combination: (6, 9, 1), Average Images per Second: 54.0 Parameter Combination: (6, 9, 3), Average Images per Second: 18.0 Parameter Combination: (6, 12, 2), Average Images per Second: 36.0 Parameter Combination: (6, 12, 4), Average Images per Second: 18.0 Parameter Combination: (8, 3, 1), Average Images per Second: 24.0 Parameter Combination: (8, 3, 3), Average Images per Second: 8.0 Parameter Combination: (8, 6, 2), Average Images per Second: 24.0 Parameter Combination: (8, 6, 4), Average Images per Second: 12.0 Parameter Combination: (8, 9, 1), Average Images per Second: 72.0 Parameter Combination: (8, 9, 3), Average Images per Second: 24.0 Parameter Combination: (8, 12, 2), Average Images per Second: 48.0 Parameter Combination: (8, 12, 4), Average Images per Second: 24.0
#vi) write the results to a pickle file in your bucket (2%)
import pickle
import os
from google.cloud import storage
os.makedirs('/tmp', exist_ok=True)
results_task2a = {
'2a iii results': finalresults,
'2a iv results': collected_results_by_parameter,
'2a v results': collected_averages
}
pickle_file_path = '/tmp/all_results.pkl'
with open(pickle_file_path, 'wb') as f:
pickle.dump(results_task2a, f)
def upload_to_bucket(blob_name, path_to_file, bucket_name):
"""Uploads a file to the specified Google Cloud Storage bucket."""
try:
client = storage.Client()
bucket = client.get_bucket(bucket_name)
blob = bucket.blob(blob_name)
blob.upload_from_filename(path_to_file)
print("File uploaded successfully to:", blob.public_url)
except Exception as e:
print(f"An error occurred: {e}")
bucket_name = 'hale-ripsaw-421615'
upload_to_bucket('results2a.pkl', '/tmp/all_results.pkl', 'hale-ripsaw-421615-storage')
#we ensure that the tmp directory exists so we store the pickle file
#we aggregate results from multiple tasks into a dictionary
#we serialize the dictionary to a pickle file
#we upload the file to google storage under project id
File uploaded successfully to: https://storage.googleapis.com/hale-ripsaw-421615-storage/results2a.pkl
#vii) Write your code it into a file using the cell magic %%writefile spark_job.py (1%)
%%writefile spark_job.py
import itertools
import time
import tensorflow as tf
import pyspark
from pyspark import SparkContext
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
PROJECT = 'hale-ripsaw-421615'
BUCKET = 'gs://{}-storage'.format(PROJECT)
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
filenames = tf.io.gfile.glob(GCS_OUTPUT + "*.tfrec")
TARGET_SIZE = [192,192]
PARTITIONS = 16
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
import tensorflow as tf
import itertools
TARGET_SIZE = [192, 192]
def read_tfrecord(recordstfrecords):
features = {
"image": tf.io.FixedLenFeature([], tf.string),
"class": tf.io.FixedLenFeature([], tf.int64)
}
example = tf.io.parse_single_example(recordstfrecords, features)
image = tf.image.decode_jpeg(example['image'], channels=3)
image = tf.reshape(image, [*TARGET_SIZE, 3])
class_num = example['class']
return image, class_num
def load_dataset(filenames):
option_no_order = tf.data.Options()
option_no_order.experimental_deterministic = False
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.with_options(option_no_order)
dataset2 = dataset.map(read_tfrecord)
return dataset2
def recompress_image(image, label):
uint8_image = tf.cast(image, tf.uint8)
jpeg_image = tf.image.encode_jpeg(uint8_image, optimize_size=True, chroma_downsampling=False)
return jpeg_image, label
def resize_and_crop_image(image, label):
image_width = tf.shape(image)[0]
image_height = tf.shape(image)[1]
target_width = TARGET_SIZE[1]
target_height = TARGET_SIZE[0]
resize_crit = (image_width * target_height) / (image_height * target_width)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [target_width, image_width * target_width // image_width]),
lambda: tf.image.resize(image, [target_height, image_height * target_height // image_height]))
new_width = tf.shape(image)[0]
new_height = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (new_height - target_height) // 2, (new_width - target_width) // 2, target_width, target_height)
return image, label
def decode_jpeg_and_label(filepath):
image_data = tf.io.read_file(filepath)
decoded_image = tf.image.decode_jpeg(image_data)
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
class_label = label.values[-2]
return decoded_image, class_label
def load_image_jpeg_dataset():
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
files_dataset = tf.data.Dataset.list_files(GCS_PATTERN)
decoded_images_dataset = files_dataset.map(decode_jpeg_and_label)
resized_dataset = decoded_images_dataset.map(resize_and_crop_image)
image_jpeg_dataset = resized_dataset.map(recompress_image)
return image_jpeg_dataset
def parameter_combinations(batch_sizes, batch_numbers, repetitions):
return list(itertools.product(batch_sizes, batch_numbers, repetitions))
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
sc = SparkContext.getOrCreate()
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
def time_configs(params):
batch_size, batch_number, repetition = params
TRF_dataset = load_dataset(filenames)
results = []
for repet in range(repetition):
start_time = time.time()
for _ in TRF_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
results.append(('TFRecord', params, images_per_second))
return results
def image_configs(params):
batch_size, batch_number, repetition = params
img_dataset = load_image_jpeg_dataset()
image_processing_results = []
for rep in range(repetition):
start_time = time.time()
for _ in img_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
image_processing_results.append(('Image', params, images_per_second))
return image_processing_results
resultsrdd = parameters.flatMap(time_configs)
resultsrdd2 = parameters.flatMap(image_configs)
combinedrddresults = resultsrdd.union(resultsrdd2)
finalresults = combinedrddresults.collect()
for result in finalresults:
result_type, params, images_per_second = result
batch_size, batch_number, repetition = params
print(f"Result Type: {result_type}, Batch Size: {batch_size}, Batch Number: {batch_number}, Repetition: {repetition}, Images/Sec: {images_per_second:.2f}")
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("ImageProcessingAggregation").getOrCreate()
sc = spark.sparkContext
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
results_rdd = parameters.flatMap(time_configs)
results_rdd2 = parameters.flatMap(image_configs)
combined_rdd_results = results_rdd.union(results_rdd2)
result_rdd_grouped = combined_rdd_results.map(lambda x: ((x[1], x[2]), x[0]))
collected_results_by_parameter = result_rdd_grouped.groupByKey().mapValues(list).collect()
for params, values in collected_results_by_parameter:
print(f"Parameter Combination: {params}, Results: {list(values)}")
spark.stop()
from pyspark.sql import SparkSession
import itertools
spark = SparkSession.builder.appName("AverageReadingSpeeds").getOrCreate()
sc = spark.sparkContext
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
parameter_combinations = list(itertools.product(batch_sizes, batch_numbers, repetitions))
data = [((bs, bn, rep), bs * bn / rep) for bs, bn, rep in parameter_combinations]
combined_rdd_results = sc.parallelize(data)
zero_value = (0.0, 0)
def seq_op(accumulator, element):
(sum, count) = accumulator
return (sum + element, count + 1)
def comb_op(accumulator1, accumulator2):
(sum1, count1) = accumulator1
(sum2, count2) = accumulator2
return (sum1 + sum2, count1 + count2)
average_speeds_rdd = combined_rdd_results.aggregateByKey(zero_value, seq_op, comb_op)
average_speeds_rdd = average_speeds_rdd.mapValues(lambda x: x[0] / x[1])
collected_averages = average_speeds_rdd.collect()
for parameter_combination, avg_speed in collected_averages:
print(f"Parameter Combination: {parameter_combination}, Average Images per Second: {avg_speed}")
spark.stop()
import pickle
import os
from google.cloud import storage
os.makedirs('/tmp', exist_ok=True)
results_task2a = {
'2a iii results': finalresults,
'2a iv results': collected_results_by_parameter,
'2a v results': collected_averages
}
pickle_file_path = '/tmp/all_results.pkl'
with open(pickle_file_path, 'wb') as f:
pickle.dump(results_task2a, f)
def upload_to_bucket(blob_name, path_to_file, bucket_name):
"""Uploads a file to the specified Google Cloud Storage bucket."""
try:
client = storage.Client()
bucket = client.get_bucket(bucket_name)
blob = bucket.blob(blob_name)
blob.upload_from_filename(path_to_file)
print("File uploaded successfully to:", blob.public_url)
except Exception as e:
print(f"An error occurred: {e}")
bucket_name = 'hale-ripsaw-421615'
upload_to_bucket('results2a.pkl', '/tmp/all_results.pkl', 'hale-ripsaw-421615-storage')
Overwriting spark_job.py
i) First, test locally with %run.
It is useful to create a new filename argument, so that old results don't get overwritten.
You can for instance use datetime.datetime.now().strftime("%y%m%d-%H%M") to get a string with the current date and time and use that in the file name.
### CODING TASK
#i) First, test locally with %run.
%run ./spark_job.py
#we run spark locally
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 9.04 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 17.53 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 18.47 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 35.20 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 30.62 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 32.37 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 27.79 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 29.39 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 17.97 Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 18.05 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 35.69 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 35.93 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 54.72 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 36.14 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 36.79 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 32.21 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 34.60 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 33.54 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 64.65 Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 35.49 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 68.91 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 77.38 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 54.04 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 43.07 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 41.90 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 24.76 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 23.90 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 39.77 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 24.19 Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 23.07 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 83.79 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 57.32 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 57.61 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 65.45 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 60.00 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 49.36 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 63.68 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 52.23 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 56.45 Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 80.48 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 33.57 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 42.22 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 25.78 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 31.28 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 26.89 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 34.84 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 51.95 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 47.26 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 45.73 Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 36.66 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 101.95 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 106.18 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 86.13 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 79.83 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 84.63 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 130.69 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 114.03 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 71.54 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 113.88 Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 127.91 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 108.18 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 180.64 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 212.83 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 107.91 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 133.58 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 176.05 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 179.61 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 175.56 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 139.23 Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 105.09 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 231.64 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 191.29 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 157.94 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 119.28 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 161.67 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 152.05 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 127.31 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 153.67 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 133.78 Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 128.13 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 27.71 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 58.48 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 59.10 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 86.76 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 84.57 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 86.65 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 80.89 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 91.90 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 104.97 Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 71.53 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 177.94 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 165.16 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 185.23 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 193.45 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 191.30 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 187.46 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 14.07 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 96.87 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 96.23 Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 92.14 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 105.71 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 112.75 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 131.99 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 129.68 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 126.36 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 127.71 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 72.20 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 131.86 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 141.50 Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 132.65 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 146.46 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 127.06 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 173.80 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 174.00 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 176.71 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 177.28 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 229.02 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 242.84 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 309.16 Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 215.25 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 82.83 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 62.04 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 70.59 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 70.34 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 84.24 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 79.26 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 91.66 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 95.45 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 61.27 Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 109.03 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 170.34 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 148.11 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 205.16 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 243.64 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 240.57 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 244.89 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 290.93 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 242.30 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 223.79 Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 281.14 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 242.85 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 309.60 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 257.86 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 302.09 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 303.12 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 318.65 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 222.38 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 315.79 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 290.03 Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 325.80 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 323.02 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 287.88 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 246.71 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 265.07 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 307.19 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 262.89 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 284.74 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 267.75 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 250.65 Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 342.65 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 12.38 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 12.04 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 11.86 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 12.74 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 11.25 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 12.60 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 10.35 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 11.51 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 10.96 Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 11.59 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 16.58 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 14.12 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 14.43 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 10.82 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 13.40 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 11.14 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 13.35 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 11.15 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 13.85 Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 17.27 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 21.00 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 20.57 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 19.49 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 18.21 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 19.04 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 17.03 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 18.03 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 12.84 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 13.95 Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 17.35 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 17.29 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 17.00 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 15.99 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 17.41 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 14.82 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 13.42 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 16.47 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 15.47 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 15.07 Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 16.17 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 9.51 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 14.23 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 9.62 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 10.96 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 9.94 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 9.45 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 10.31 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 7.59 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 10.02 Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 10.64 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 16.63 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 15.03 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 16.42 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 16.36 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 15.01 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 16.49 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 19.66 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 24.04 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 22.17 Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 21.48 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 23.94 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 21.92 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 12.29 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 16.37 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 17.85 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 16.91 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 18.57 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 17.26 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 18.09 Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 18.71 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 19.94 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 27.08 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 26.49 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 25.15 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 26.18 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 23.82 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 18.02 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 18.90 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 18.15 Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 19.89 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 17.84 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 20.70 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 15.78 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 19.56 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 18.35 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 18.96 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 22.31 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 17.75 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 14.41 Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 14.46 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 16.63 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 18.20 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 23.80 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 24.70 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 26.36 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 22.69 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 24.98 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 19.96 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 12.76 Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 17.33 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 18.44 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 19.89 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 15.86 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 19.46 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 18.48 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 21.33 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 15.19 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 15.91 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 16.13 Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 17.62 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 19.16 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 19.35 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 22.19 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 25.34 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 26.68 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 17.20 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 18.17 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 19.72 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 18.56 Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 20.59 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 17.29 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 16.20 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 21.94 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 20.15 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 21.28 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 20.92 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 22.14 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 21.71 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 19.42 Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 19.38 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 17.50 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 18.99 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 18.27 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 24.40 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 24.33 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 25.11 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 26.64 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 32.61 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 32.71 Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 33.64 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 32.59 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 33.31 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 26.26 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 26.64 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 26.07 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 26.41 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 26.07 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 32.71 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 32.38 Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 33.21 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 32.34 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 26.57 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 23.15 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 24.51 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 23.99 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 27.92 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 25.74 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 29.68 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 26.54 Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 27.43 Parameter Combination: ((2, 3, 4), 32.96890426033642), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 35.72622949074222), Results: ['TFRecord'] Parameter Combination: ((2, 9, 1), 55.55422678804139), Results: ['TFRecord'] Parameter Combination: ((2, 9, 3), 85.02542063652949), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 54.02621253550285), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 102.55565290744823), Results: ['TFRecord'] Parameter Combination: ((2, 12, 2), 71.15914781475193), Results: ['TFRecord'] Parameter Combination: ((2, 12, 3), 130.08904850459353), Results: ['TFRecord'] Parameter Combination: ((2, 12, 4), 69.8681432937177), Results: ['TFRecord'] Parameter Combination: ((4, 3, 3), 33.635223807585824), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 34.97359034918941), Results: ['TFRecord'] Parameter Combination: ((4, 6, 3), 110.91799763538417), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 93.04470269835592), Results: ['TFRecord'] Parameter Combination: ((4, 9, 1), 109.86804042697169), Results: ['TFRecord'] Parameter Combination: ((4, 9, 2), 118.74517846975593), Results: ['TFRecord'] Parameter Combination: ((4, 9, 2), 138.99380214168085), Results: ['TFRecord'] Parameter Combination: ((4, 9, 3), 151.69623569763016), Results: ['TFRecord'] Parameter Combination: ((4, 12, 4), 203.65291929713112), Results: ['TFRecord'] Parameter Combination: ((4, 12, 4), 247.13596083664052), Results: ['TFRecord'] Parameter Combination: ((6, 3, 2), 106.69950012083594), Results: ['TFRecord'] Parameter Combination: ((6, 3, 3), 99.44529008701424), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 92.20873826131243), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 76.69950666850887), Results: ['TFRecord'] Parameter Combination: ((6, 6, 1), 142.58284151622573), Results: ['TFRecord'] Parameter Combination: ((6, 6, 2), 205.73928825448212), Results: ['TFRecord'] Parameter Combination: ((6, 9, 1), 247.9741704083007), Results: ['TFRecord'] Parameter Combination: ((6, 9, 3), 281.13946101340207), Results: ['TFRecord'] Parameter Combination: ((6, 9, 3), 253.5170835940412), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 134.61459175940922), Results: ['TFRecord'] Parameter Combination: ((6, 12, 3), 214.6351137746341), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 237.08241323435203), Results: ['TFRecord'] Parameter Combination: ((8, 3, 3), 109.78787617694181), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 110.66047386987871), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 110.25685523045732), Results: ['TFRecord'] Parameter Combination: ((8, 6, 3), 154.338888952773), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 169.48351984160055), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 177.10920995797622), Results: ['TFRecord'] Parameter Combination: ((8, 9, 1), 333.22580887204805), Results: ['TFRecord'] Parameter Combination: ((8, 9, 3), 423.6539949664853), Results: ['TFRecord'] Parameter Combination: ((8, 9, 4), 364.32651987757254), Results: ['TFRecord'] Parameter Combination: ((8, 9, 4), 364.72737286047624), Results: ['TFRecord'] Parameter Combination: ((8, 9, 4), 280.05487033581744), Results: ['TFRecord'] Parameter Combination: ((8, 12, 1), 378.9855372017507), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 339.6065807163352), Results: ['TFRecord'] Parameter Combination: ((2, 3, 1), 9.643326990238583), Results: ['Image'] Parameter Combination: ((2, 3, 3), 11.359520085582933), Results: ['Image'] Parameter Combination: ((2, 3, 4), 8.142756468207565), Results: ['Image'] Parameter Combination: ((2, 6, 3), 12.925847664383765), Results: ['Image'] Parameter Combination: ((2, 6, 3), 16.901237279154437), Results: ['Image'] Parameter Combination: ((2, 6, 3), 20.245019055759464), Results: ['Image'] Parameter Combination: ((2, 6, 4), 19.643857173188124), Results: ['Image'] Parameter Combination: ((2, 9, 2), 20.777144046020577), Results: ['Image'] Parameter Combination: ((2, 9, 3), 13.24944754096059), Results: ['Image'] Parameter Combination: ((2, 9, 4), 14.687309739471473), Results: ['Image'] Parameter Combination: ((2, 12, 3), 22.63685188504202), Results: ['Image'] Parameter Combination: ((4, 3, 2), 12.076742510349355), Results: ['Image'] Parameter Combination: ((4, 3, 3), 9.174361479515577), Results: ['Image'] Parameter Combination: ((4, 3, 3), 9.891995057505534), Results: ['Image'] Parameter Combination: ((4, 3, 4), 10.499899865151738), Results: ['Image'] Parameter Combination: ((4, 3, 4), 10.603956559964116), Results: ['Image'] Parameter Combination: ((4, 6, 1), 16.60261186521746), Results: ['Image'] Parameter Combination: ((4, 6, 2), 15.677340801396431), Results: ['Image'] Parameter Combination: ((4, 6, 4), 21.72529260524692), Results: ['Image'] Parameter Combination: ((4, 9, 2), 22.32308019147635), Results: ['Image'] Parameter Combination: ((4, 12, 4), 19.32813523491431), Results: ['Image'] Parameter Combination: ((6, 9, 2), 20.98930649379919), Results: ['Image'] Parameter Combination: ((6, 9, 3), 17.788243077687433), Results: ['Image'] Parameter Combination: ((6, 9, 3), 17.07959826836484), Results: ['Image'] Parameter Combination: ((6, 9, 4), 18.230290323673746), Results: ['Image'] Parameter Combination: ((6, 12, 2), 19.82486625644888), Results: ['Image'] Parameter Combination: ((8, 3, 4), 22.20992212219823), Results: ['Image'] Parameter Combination: ((8, 3, 4), 22.89567750767808), Results: ['Image'] Parameter Combination: ((8, 6, 3), 26.083114987894266), Results: ['Image'] Parameter Combination: ((8, 6, 4), 25.915577864866762), Results: ['Image'] Parameter Combination: ((8, 6, 4), 25.818370402744158), Results: ['Image'] Parameter Combination: ((8, 9, 2), 26.32508418206968), Results: ['Image'] Parameter Combination: ((8, 9, 3), 27.171572904356008), Results: ['Image'] Parameter Combination: ((8, 9, 3), 27.048532603798638), Results: ['Image'] Parameter Combination: ((8, 9, 4), 32.48237992384025), Results: ['Image'] Parameter Combination: ((8, 12, 4), 35.13321626716564), Results: ['Image'] Parameter Combination: ((8, 12, 4), 27.812772513282194), Results: ['Image'] Parameter Combination: ((4, 12, 2), 222.1282348047615), Results: ['TFRecord'] Parameter Combination: ((6, 9, 3), 18.448881447183606), Results: ['Image'] Parameter Combination: ((6, 3, 3), 76.0402472851212), Results: ['TFRecord'] Parameter Combination: ((6, 12, 3), 225.75881273800783), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 13.554213733230139), Results: ['Image'] Parameter Combination: ((8, 3, 1), 104.48894992355098), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 7.5911020055055936), Results: ['Image'] Parameter Combination: ((8, 3, 3), 22.72931527300816), Results: ['Image'] Parameter Combination: ((4, 9, 3), 16.77732225637429), Results: ['Image'] Parameter Combination: ((4, 12, 4), 156.31031535109275), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 16.756129342119017), Results: ['Image'] Parameter Combination: ((6, 12, 2), 192.45861236517885), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 21.22080700934077), Results: ['Image'] Parameter Combination: ((8, 3, 4), 89.66850285404804), Results: ['TFRecord'] Parameter Combination: ((8, 12, 2), 378.4789749142754), Results: ['TFRecord'] Parameter Combination: ((4, 6, 2), 68.80504599384015), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 53.91783075947414), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 102.81878909457875), Results: ['TFRecord'] Parameter Combination: ((8, 6, 2), 176.36464553023296), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 170.09652906973798), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 12.926220569284679), Results: ['Image'] Parameter Combination: ((4, 3, 3), 34.782894259455446), Results: ['TFRecord'] Parameter Combination: ((8, 3, 3), 102.56181780947112), Results: ['TFRecord'] Parameter Combination: ((2, 12, 1), 135.74915951824516), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 66.56577602202827), Results: ['TFRecord'] Parameter Combination: ((6, 6, 2), 166.81519682090408), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 32.83137566983141), Results: ['TFRecord'] Parameter Combination: ((2, 6, 3), 35.73439697605881), Results: ['TFRecord'] Parameter Combination: ((4, 9, 4), 171.35791966789498), Results: ['TFRecord'] Parameter Combination: ((6, 3, 3), 12.45738104741537), Results: ['Image'] Parameter Combination: ((8, 12, 2), 26.869114249119463), Results: ['Image'] Parameter Combination: ((8, 6, 1), 19.752595558342815), Results: ['Image'] Parameter Combination: ((2, 3, 2), 25.11283591621678), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 7.614716724565667), Results: ['Image'] Parameter Combination: ((4, 9, 4), 163.83786669444407), Results: ['TFRecord'] Parameter Combination: ((4, 9, 3), 96.55161336114453), Results: ['TFRecord'] Parameter Combination: ((4, 3, 1), 32.396891081652555), Results: ['TFRecord'] Parameter Combination: ((6, 3, 2), 21.558214840086944), Results: ['Image'] Parameter Combination: ((4, 9, 3), 16.643324155684002), Results: ['Image'] Parameter Combination: ((6, 3, 4), 15.012046228310844), Results: ['Image'] Parameter Combination: ((8, 9, 2), 301.90656178894625), Results: ['TFRecord'] Parameter Combination: ((8, 12, 3), 27.010608011256824), Results: ['Image'] Parameter Combination: ((2, 6, 4), 56.153408811992094), Results: ['TFRecord'] Parameter Combination: ((2, 12, 2), 72.76187997935614), Results: ['TFRecord'] Parameter Combination: ((4, 3, 2), 51.33122086388238), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 7.573636722313193), Results: ['Image'] Parameter Combination: ((2, 6, 3), 35.87507074278138), Results: ['TFRecord'] Parameter Combination: ((6, 3, 3), 12.877409776652184), Results: ['Image'] Parameter Combination: ((6, 9, 4), 17.426407777747002), Results: ['Image'] Parameter Combination: ((2, 9, 2), 91.07086274136094), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 13.717592374725571), Results: ['Image'] Parameter Combination: ((4, 3, 4), 9.250671952101724), Results: ['Image'] Parameter Combination: ((2, 12, 3), 69.57588575717801), Results: ['TFRecord'] Parameter Combination: ((2, 9, 3), 18.3770304255922), Results: ['Image'] Parameter Combination: ((6, 6, 4), 156.07954741617678), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 18.967012371930696), Results: ['Image'] Parameter Combination: ((2, 3, 2), 9.97399039690545), Results: ['Image'] Parameter Combination: ((2, 6, 3), 35.59220433909428), Results: ['TFRecord'] Parameter Combination: ((8, 3, 3), 86.22212476702116), Results: ['TFRecord'] Parameter Combination: ((8, 6, 1), 183.44459620639665), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 408.16752729373843), Results: ['TFRecord'] Parameter Combination: ((6, 6, 3), 187.99241531031615), Results: ['TFRecord'] Parameter Combination: ((8, 3, 4), 89.14606954511842), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 13.718120790735325), Results: ['Image'] Parameter Combination: ((4, 3, 3), 10.32772006372485), Results: ['Image'] Parameter Combination: ((4, 9, 3), 136.81080968435512), Results: ['TFRecord'] Parameter Combination: ((4, 12, 2), 26.007333538557013), Results: ['Image'] Parameter Combination: ((6, 9, 4), 17.184496197433027), Results: ['Image'] Parameter Combination: ((6, 6, 3), 171.57794956348425), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 250.3655193683282), Results: ['TFRecord'] Parameter Combination: ((2, 3, 3), 12.3857677349626), Results: ['Image'] Parameter Combination: ((4, 6, 4), 22.316577308690277), Results: ['Image'] Parameter Combination: ((8, 9, 4), 31.310950231029672), Results: ['Image'] Parameter Combination: ((4, 6, 3), 105.1148027830598), Results: ['TFRecord'] Parameter Combination: ((4, 12, 3), 27.912451052214482), Results: ['Image'] Parameter Combination: ((6, 6, 4), 180.11461398714343), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 29.817485993704942), Results: ['TFRecord'] Parameter Combination: ((8, 6, 3), 25.48968639672438), Results: ['Image'] Parameter Combination: ((8, 3, 1), 16.42417292818437), Results: ['Image'] Parameter Combination: ((8, 9, 1), 26.972912483455094), Results: ['Image'] Parameter Combination: ((4, 6, 4), 22.480178852932053), Results: ['Image'] Parameter Combination: ((8, 9, 4), 347.8040254481294), Results: ['TFRecord'] Parameter Combination: ((4, 9, 3), 16.40048412374547), Results: ['Image'] Parameter Combination: ((2, 6, 4), 16.118816092027643), Results: ['Image'] Parameter Combination: ((2, 3, 2), 8.852552575369991), Results: ['TFRecord'] Parameter Combination: ((2, 3, 3), 17.650046078683033), Results: ['TFRecord'] Parameter Combination: ((2, 3, 3), 17.64586301677231), Results: ['TFRecord'] Parameter Combination: ((2, 3, 3), 33.73168073838664), Results: ['TFRecord'] Parameter Combination: ((2, 6, 2), 35.454085539250045), Results: ['TFRecord'] Parameter Combination: ((2, 9, 2), 54.36588674810541), Results: ['TFRecord'] Parameter Combination: ((2, 9, 3), 51.71594596427439), Results: ['TFRecord'] Parameter Combination: ((2, 9, 3), 55.564693820925555), Results: ['TFRecord'] Parameter Combination: ((2, 9, 4), 88.28182841881366), Results: ['TFRecord'] Parameter Combination: ((2, 12, 3), 72.27586563418811), Results: ['TFRecord'] Parameter Combination: ((2, 12, 4), 71.558566487006), Results: ['TFRecord'] Parameter Combination: ((2, 12, 4), 71.98096778553149), Results: ['TFRecord'] Parameter Combination: ((2, 12, 4), 115.65668117785337), Results: ['TFRecord'] Parameter Combination: ((4, 3, 2), 30.62990873401537), Results: ['TFRecord'] Parameter Combination: ((4, 3, 3), 47.12890874819866), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 32.25469674015857), Results: ['TFRecord'] Parameter Combination: ((4, 6, 1), 126.92335800015887), Results: ['TFRecord'] Parameter Combination: ((4, 6, 3), 60.985844549954834), Results: ['TFRecord'] Parameter Combination: ((4, 9, 4), 106.50600227267437), Results: ['TFRecord'] Parameter Combination: ((4, 12, 3), 242.16594054546897), Results: ['TFRecord'] Parameter Combination: ((4, 12, 3), 242.17904928709163), Results: ['TFRecord'] Parameter Combination: ((4, 12, 3), 214.2709120690004), Results: ['TFRecord'] Parameter Combination: ((6, 3, 1), 51.093243893476156), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 54.61412346822147), Results: ['TFRecord'] Parameter Combination: ((6, 6, 3), 194.39423440867412), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 121.89043378302453), Results: ['TFRecord'] Parameter Combination: ((6, 9, 2), 290.88020343031803), Results: ['TFRecord'] Parameter Combination: ((6, 9, 3), 263.22462237914215), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 272.1567867841526), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 204.32536182136224), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 287.41014610822214), Results: ['TFRecord'] Parameter Combination: ((8, 6, 2), 189.70703604240282), Results: ['TFRecord'] Parameter Combination: ((8, 6, 3), 204.64698940306474), Results: ['TFRecord'] Parameter Combination: ((8, 12, 3), 322.3835489212066), Results: ['TFRecord'] Parameter Combination: ((8, 12, 3), 246.2111265881455), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 441.8583957369479), Results: ['TFRecord'] Parameter Combination: ((2, 6, 2), 11.647016027139227), Results: ['Image'] Parameter Combination: ((2, 6, 4), 17.571660036343133), Results: ['Image'] Parameter Combination: ((2, 9, 2), 22.904347936886246), Results: ['Image'] Parameter Combination: ((2, 9, 3), 15.245294296534336), Results: ['Image'] Parameter Combination: ((2, 12, 1), 18.573297174464084), Results: ['Image'] Parameter Combination: ((2, 12, 2), 17.264918289323184), Results: ['Image'] Parameter Combination: ((2, 12, 2), 21.196793337189593), Results: ['Image'] Parameter Combination: ((2, 12, 4), 15.412769733777848), Results: ['Image'] Parameter Combination: ((2, 12, 4), 15.900399092320072), Results: ['Image'] Parameter Combination: ((2, 12, 4), 15.718658651756135), Results: ['Image'] Parameter Combination: ((4, 3, 1), 9.316634896494891), Results: ['Image'] Parameter Combination: ((4, 3, 2), 10.486317085595172), Results: ['Image'] Parameter Combination: ((4, 6, 2), 13.555323461495577), Results: ['Image'] Parameter Combination: ((4, 6, 3), 16.1678679205857), Results: ['Image'] Parameter Combination: ((4, 6, 3), 16.91928441132113), Results: ['Image'] Parameter Combination: ((4, 9, 1), 23.64878961911801), Results: ['Image'] Parameter Combination: ((4, 9, 4), 18.614667789172827), Results: ['Image'] Parameter Combination: ((4, 9, 4), 18.02137573821488), Results: ['Image'] Parameter Combination: ((4, 9, 4), 18.234551768237125), Results: ['Image'] Parameter Combination: ((4, 12, 3), 26.536178809923246), Results: ['Image'] Parameter Combination: ((4, 12, 4), 17.321895795843723), Results: ['Image'] Parameter Combination: ((6, 3, 3), 13.593436760944659), Results: ['Image'] Parameter Combination: ((6, 3, 4), 14.63454608999326), Results: ['Image'] Parameter Combination: ((6, 6, 1), 24.366544485601796), Results: ['Image'] Parameter Combination: ((6, 6, 3), 18.232222293731418), Results: ['Image'] Parameter Combination: ((6, 6, 4), 17.2264708761357), Results: ['Image'] Parameter Combination: ((6, 9, 1), 25.199880238148513), Results: ['Image'] Parameter Combination: ((6, 12, 1), 18.68657492942488), Results: ['Image'] Parameter Combination: ((6, 12, 3), 28.788452507853695), Results: ['Image'] Parameter Combination: ((6, 12, 3), 24.9785762661171), Results: ['Image'] Parameter Combination: ((6, 12, 4), 19.143893682664885), Results: ['Image'] Parameter Combination: ((6, 12, 4), 19.98889374580848), Results: ['Image'] Parameter Combination: ((8, 3, 3), 23.087292382291576), Results: ['Image'] Parameter Combination: ((8, 6, 2), 17.663230117541033), Results: ['Image'] Parameter Combination: ((8, 9, 2), 24.967152048763968), Results: ['Image'] Parameter Combination: ((8, 9, 4), 26.75164359806418), Results: ['Image'] Parameter Combination: ((8, 12, 1), 36.41854412356864), Results: ['Image'] Parameter Combination: ((8, 12, 3), 30.256457916165967), Results: ['Image'] Parameter Combination: ((8, 12, 4), 33.588308608257144), Results: ['Image'] Parameter Combination: ((2, 3, 1), 20.396971313063197), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 17.78945999287455), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 17.76923696106218), Results: ['TFRecord'] Parameter Combination: ((2, 3, 4), 17.765586647549785), Results: ['TFRecord'] Parameter Combination: ((2, 6, 1), 35.75528923682397), Results: ['TFRecord'] Parameter Combination: ((2, 6, 2), 32.92100982365303), Results: ['TFRecord'] Parameter Combination: ((2, 6, 4), 66.38955529819582), Results: ['TFRecord'] Parameter Combination: ((4, 3, 4), 51.99448357935123), Results: ['TFRecord'] Parameter Combination: ((4, 6, 2), 70.88485285501825), Results: ['TFRecord'] Parameter Combination: ((4, 6, 4), 60.338990203177374), Results: ['TFRecord'] Parameter Combination: ((4, 9, 4), 177.70801242820826), Results: ['TFRecord'] Parameter Combination: ((4, 12, 1), 211.17383930041777), Results: ['TFRecord'] Parameter Combination: ((4, 12, 2), 176.3139848528371), Results: ['TFRecord'] Parameter Combination: ((4, 12, 4), 194.74404841937664), Results: ['TFRecord'] Parameter Combination: ((6, 3, 2), 103.30373958376093), Results: ['TFRecord'] Parameter Combination: ((6, 3, 3), 106.60066899454553), Results: ['TFRecord'] Parameter Combination: ((6, 3, 4), 113.94589275445875), Results: ['TFRecord'] Parameter Combination: ((6, 6, 4), 182.3313155463783), Results: ['TFRecord'] Parameter Combination: ((6, 9, 2), 225.72112690935074), Results: ['TFRecord'] Parameter Combination: ((6, 9, 4), 171.48707822419752), Results: ['TFRecord'] Parameter Combination: ((6, 12, 1), 109.43458763340504), Results: ['TFRecord'] Parameter Combination: ((6, 12, 2), 254.1884744393147), Results: ['TFRecord'] Parameter Combination: ((6, 12, 3), 267.9869054728841), Results: ['TFRecord'] Parameter Combination: ((6, 12, 4), 288.8575568910617), Results: ['TFRecord'] Parameter Combination: ((8, 3, 2), 77.54622384749486), Results: ['TFRecord'] Parameter Combination: ((8, 3, 2), 69.49250318767263), Results: ['TFRecord'] Parameter Combination: ((8, 6, 3), 203.16605748446435), Results: ['TFRecord'] Parameter Combination: ((8, 6, 4), 208.8376468049882), Results: ['TFRecord'] Parameter Combination: ((8, 9, 2), 303.32207856907536), Results: ['TFRecord'] Parameter Combination: ((8, 9, 3), 326.04200684495214), Results: ['TFRecord'] Parameter Combination: ((8, 9, 3), 294.4111560216897), Results: ['TFRecord'] Parameter Combination: ((8, 12, 2), 472.1343658100737), Results: ['TFRecord'] Parameter Combination: ((8, 12, 3), 353.2380120221916), Results: ['TFRecord'] Parameter Combination: ((8, 12, 4), 458.15656052477374), Results: ['TFRecord'] Parameter Combination: ((2, 3, 2), 11.81220130166994), Results: ['Image'] Parameter Combination: ((2, 3, 3), 10.634137230600466), Results: ['Image'] Parameter Combination: ((2, 6, 1), 11.389709000539936), Results: ['Image'] Parameter Combination: ((2, 6, 2), 12.001216057974014), Results: ['Image'] Parameter Combination: ((2, 6, 4), 18.779750919927675), Results: ['Image'] Parameter Combination: ((2, 9, 1), 18.853831464077754), Results: ['Image'] Parameter Combination: ((2, 12, 3), 23.764182793604704), Results: ['Image'] Parameter Combination: ((2, 12, 3), 23.02443630175525), Results: ['Image'] Parameter Combination: ((2, 12, 4), 12.850935939045714), Results: ['Image'] Parameter Combination: ((4, 3, 4), 11.190251615674466), Results: ['Image'] Parameter Combination: ((4, 6, 3), 15.99064928710822), Results: ['Image'] Parameter Combination: ((4, 6, 4), 24.342387956982176), Results: ['Image'] Parameter Combination: ((4, 9, 2), 23.629131030735643), Results: ['Image'] Parameter Combination: ((4, 9, 4), 21.07195420171392), Results: ['Image'] Parameter Combination: ((4, 12, 1), 19.36826728949917), Results: ['Image'] Parameter Combination: ((4, 12, 2), 24.72025378564072), Results: ['Image'] Parameter Combination: ((4, 12, 3), 25.86117939147806), Results: ['Image'] Parameter Combination: ((4, 12, 4), 18.709782139285547), Results: ['Image'] Parameter Combination: ((4, 12, 4), 18.497694249520507), Results: ['Image'] Parameter Combination: ((6, 3, 1), 20.113725479748396), Results: ['Image'] Parameter Combination: ((6, 3, 2), 19.057279771244403), Results: ['Image'] Parameter Combination: ((6, 3, 4), 13.605251406433643), Results: ['Image'] Parameter Combination: ((6, 3, 4), 17.397871535345594), Results: ['Image'] Parameter Combination: ((6, 6, 2), 24.318670938521148), Results: ['Image'] Parameter Combination: ((6, 6, 2), 24.936759087151938), Results: ['Image'] Parameter Combination: ((6, 6, 3), 21.473572116073807), Results: ['Image'] Parameter Combination: ((6, 6, 3), 25.899034293870915), Results: ['Image'] Parameter Combination: ((6, 6, 4), 18.043270166628606), Results: ['Image'] Parameter Combination: ((6, 9, 2), 25.582087195482494), Results: ['Image'] Parameter Combination: ((6, 9, 4), 19.733629426100702), Results: ['Image'] Parameter Combination: ((6, 12, 2), 22.924537789405413), Results: ['Image'] Parameter Combination: ((6, 12, 3), 27.06853444613235), Results: ['Image'] Parameter Combination: ((6, 12, 4), 20.229690234888636), Results: ['Image'] Parameter Combination: ((8, 3, 2), 17.40346820089715), Results: ['Image'] Parameter Combination: ((8, 3, 2), 17.793462945964333), Results: ['Image'] Parameter Combination: ((8, 3, 3), 24.855239145448266), Results: ['Image'] Parameter Combination: ((8, 3, 4), 19.923210472940074), Results: ['Image'] Parameter Combination: ((8, 6, 2), 18.457911938692988), Results: ['Image'] Parameter Combination: ((8, 6, 3), 19.613730876702725), Results: ['Image'] Parameter Combination: ((8, 6, 4), 24.43875870902709), Results: ['Image'] Parameter Combination: ((8, 6, 4), 24.443253915594376), Results: ['Image'] Parameter Combination: ((8, 9, 3), 18.350347449942433), Results: ['Image'] Parameter Combination: ((8, 9, 4), 33.9869384497318), Results: ['Image'] Parameter Combination: ((8, 12, 2), 28.49298553743863), Results: ['Image'] Parameter Combination: ((8, 12, 3), 33.992022638094404), Results: ['Image'] Parameter Combination: ((8, 12, 4), 26.83806347823351), Results: ['Image'] Parameter Combination: (2, 3, 2), Average Images per Second: 3.0 Parameter Combination: (2, 3, 4), Average Images per Second: 1.5 Parameter Combination: (2, 6, 1), Average Images per Second: 12.0 Parameter Combination: (2, 6, 3), Average Images per Second: 4.0 Parameter Combination: (2, 9, 2), Average Images per Second: 9.0 Parameter Combination: (2, 9, 4), Average Images per Second: 4.5 Parameter Combination: (2, 12, 1), Average Images per Second: 24.0 Parameter Combination: (2, 12, 3), Average Images per Second: 8.0 Parameter Combination: (4, 3, 2), Average Images per Second: 6.0 Parameter Combination: (4, 3, 4), Average Images per Second: 3.0 Parameter Combination: (4, 6, 1), Average Images per Second: 24.0 Parameter Combination: (4, 6, 3), Average Images per Second: 8.0 Parameter Combination: (4, 9, 2), Average Images per Second: 18.0 Parameter Combination: (4, 9, 4), Average Images per Second: 9.0 Parameter Combination: (4, 12, 1), Average Images per Second: 48.0 Parameter Combination: (4, 12, 3), Average Images per Second: 16.0 Parameter Combination: (6, 3, 2), Average Images per Second: 9.0 Parameter Combination: (6, 3, 4), Average Images per Second: 4.5 Parameter Combination: (6, 6, 1), Average Images per Second: 36.0 Parameter Combination: (6, 6, 3), Average Images per Second: 12.0 Parameter Combination: (6, 9, 2), Average Images per Second: 27.0 Parameter Combination: (6, 9, 4), Average Images per Second: 13.5 Parameter Combination: (6, 12, 1), Average Images per Second: 72.0 Parameter Combination: (6, 12, 3), Average Images per Second: 24.0 Parameter Combination: (8, 3, 2), Average Images per Second: 12.0 Parameter Combination: (8, 3, 4), Average Images per Second: 6.0 Parameter Combination: (8, 6, 1), Average Images per Second: 48.0 Parameter Combination: (8, 6, 3), Average Images per Second: 16.0 Parameter Combination: (8, 9, 2), Average Images per Second: 36.0 Parameter Combination: (8, 9, 4), Average Images per Second: 18.0 Parameter Combination: (8, 12, 1), Average Images per Second: 96.0 Parameter Combination: (8, 12, 3), Average Images per Second: 32.0 Parameter Combination: (2, 3, 1), Average Images per Second: 6.0 Parameter Combination: (2, 3, 3), Average Images per Second: 2.0 Parameter Combination: (2, 6, 2), Average Images per Second: 6.0 Parameter Combination: (2, 6, 4), Average Images per Second: 3.0 Parameter Combination: (2, 9, 1), Average Images per Second: 18.0 Parameter Combination: (2, 9, 3), Average Images per Second: 6.0 Parameter Combination: (2, 12, 2), Average Images per Second: 12.0 Parameter Combination: (2, 12, 4), Average Images per Second: 6.0 Parameter Combination: (4, 3, 1), Average Images per Second: 12.0 Parameter Combination: (4, 3, 3), Average Images per Second: 4.0 Parameter Combination: (4, 6, 2), Average Images per Second: 12.0 Parameter Combination: (4, 6, 4), Average Images per Second: 6.0 Parameter Combination: (4, 9, 1), Average Images per Second: 36.0 Parameter Combination: (4, 9, 3), Average Images per Second: 12.0 Parameter Combination: (4, 12, 2), Average Images per Second: 24.0 Parameter Combination: (4, 12, 4), Average Images per Second: 12.0 Parameter Combination: (6, 3, 1), Average Images per Second: 18.0 Parameter Combination: (6, 3, 3), Average Images per Second: 6.0 Parameter Combination: (6, 6, 2), Average Images per Second: 18.0 Parameter Combination: (6, 6, 4), Average Images per Second: 9.0 Parameter Combination: (6, 9, 1), Average Images per Second: 54.0 Parameter Combination: (6, 9, 3), Average Images per Second: 18.0 Parameter Combination: (6, 12, 2), Average Images per Second: 36.0 Parameter Combination: (6, 12, 4), Average Images per Second: 18.0 Parameter Combination: (8, 3, 1), Average Images per Second: 24.0 Parameter Combination: (8, 3, 3), Average Images per Second: 8.0 Parameter Combination: (8, 6, 2), Average Images per Second: 24.0 Parameter Combination: (8, 6, 4), Average Images per Second: 12.0 Parameter Combination: (8, 9, 1), Average Images per Second: 72.0 Parameter Combination: (8, 9, 3), Average Images per Second: 24.0 Parameter Combination: (8, 12, 2), Average Images per Second: 48.0 Parameter Combination: (8, 12, 4), Average Images per Second: 24.0 File uploaded successfully to: https://storage.googleapis.com/hale-ripsaw-421615-storage/results2a.pkl
ii) Cloud
If you have a cluster running, you can run the speed test job in the cloud.
While you run this job, switch to the Dataproc web page and take screenshots of the CPU and network load over time. They are displayed with some delay, so you may need to wait a little. These images will be useful in the next task. Again, don't use the SCREENSHOT function that Google provides, but just take a picture of the graphs you see for the VMs.
### CODING TASK ###
#ii) New filename argument
%%writefile spark_job_2b.py
import itertools
import time
import tensorflow as tf
import pyspark
from pyspark import SparkContext
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
PROJECT = 'hale-ripsaw-421615'
BUCKET = 'gs://{}-storage'.format(PROJECT)
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
filenames = tf.io.gfile.glob(GCS_OUTPUT + "*.tfrec")
TARGET_SIZE = [192,192]
PARTITIONS = 16
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
import tensorflow as tf
import itertools
TARGET_SIZE = [192, 192]
def read_tfrecord(recordstfrecords):
features = {
"image": tf.io.FixedLenFeature([], tf.string),
"class": tf.io.FixedLenFeature([], tf.int64)
}
example = tf.io.parse_single_example(recordstfrecords, features)
image = tf.image.decode_jpeg(example['image'], channels=3)
image = tf.reshape(image, [*TARGET_SIZE, 3])
class_num = example['class']
return image, class_num
def load_dataset(filenames):
option_no_order = tf.data.Options()
option_no_order.experimental_deterministic = False
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.with_options(option_no_order)
dataset2 = dataset.map(read_tfrecord)
return dataset2
def recompress_image(image, label):
uint8_image = tf.cast(image, tf.uint8)
jpeg_image = tf.image.encode_jpeg(uint8_image, optimize_size=True, chroma_downsampling=False)
return jpeg_image, label
def resize_and_crop_image(image, label):
image_width = tf.shape(image)[0]
image_height = tf.shape(image)[1]
target_width = TARGET_SIZE[1]
target_height = TARGET_SIZE[0]
resize_crit = (image_width * target_height) / (image_height * target_width)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [target_width, image_width * target_width // image_width]),
lambda: tf.image.resize(image, [target_height, image_height * target_height // image_height]))
new_width = tf.shape(image)[0]
new_height = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (new_height - target_height) // 2, (new_width - target_width) // 2, target_width, target_height)
return image, label
def decode_jpeg_and_label(filepath):
image_data = tf.io.read_file(filepath)
decoded_image = tf.image.decode_jpeg(image_data)
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
class_label = label.values[-2]
return decoded_image, class_label
def load_image_jpeg_dataset():
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
files_dataset = tf.data.Dataset.list_files(GCS_PATTERN)
decoded_images_dataset = files_dataset.map(decode_jpeg_and_label)
resized_dataset = decoded_images_dataset.map(resize_and_crop_image)
image_jpeg_dataset = resized_dataset.map(recompress_image)
return image_jpeg_dataset
def parameter_combinations(batch_sizes, batch_numbers, repetitions):
return list(itertools.product(batch_sizes, batch_numbers, repetitions))
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
sc = SparkContext.getOrCreate()
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
def time_configs(params):
batch_size, batch_number, repetition = params
TRF_dataset = load_dataset(filenames)
results = []
for repet in range(repetition):
start_time = time.time()
for _ in TRF_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
results.append(('TFRecord', params, images_per_second))
return results
def image_configs(params):
batch_size, batch_number, repetition = params
img_dataset = load_image_jpeg_dataset()
image_processing_results = []
for rep in range(repetition):
start_time = time.time()
for _ in img_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
image_processing_results.append(('Image', params, images_per_second))
return image_processing_results
resultsrdd = parameters.flatMap(time_configs)
resultsrdd2 = parameters.flatMap(image_configs)
combinedrddresults = resultsrdd.union(resultsrdd2)
finalresults = combinedrddresults.collect()
for result in finalresults:
result_type, params, images_per_second = result
batch_size, batch_number, repetition = params
print(f"Result Type: {result_type}, Batch Size: {batch_size}, Batch Number: {batch_number}, Repetition: {repetition}, Images/Sec: {images_per_second:.2f}")
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("ImageProcessingAggregation").getOrCreate()
sc = spark.sparkContext
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
results_rdd = parameters.flatMap(time_configs)
results_rdd2 = parameters.flatMap(image_configs)
combined_rdd_results = results_rdd.union(results_rdd2)
result_rdd_grouped = combined_rdd_results.map(lambda x: ((x[1], x[2]), x[0]))
collected_results_by_parameter = result_rdd_grouped.groupByKey().mapValues(list).collect()
for params, values in collected_results_by_parameter:
print(f"Parameter Combination: {params}, Results: {list(values)}")
spark.stop()
from pyspark.sql import SparkSession
import itertools
spark = SparkSession.builder.appName("AverageReadingSpeeds").getOrCreate()
sc = spark.sparkContext
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
parameter_combinations = list(itertools.product(batch_sizes, batch_numbers, repetitions))
data = [((bs, bn, rep), bs * bn / rep) for bs, bn, rep in parameter_combinations]
combined_rdd_results = sc.parallelize(data)
zero_value = (0.0, 0)
def seq_op(accumulator, element):
(sum, count) = accumulator
return (sum + element, count + 1)
def comb_op(accumulator1, accumulator2):
(sum1, count1) = accumulator1
(sum2, count2) = accumulator2
return (sum1 + sum2, count1 + count2)
average_speeds_rdd = combined_rdd_results.aggregateByKey(zero_value, seq_op, comb_op)
average_speeds_rdd = average_speeds_rdd.mapValues(lambda x: x[0] / x[1])
collected_averages = average_speeds_rdd.collect()
for parameter_combination, avg_speed in collected_averages:
print(f"Parameter Combination: {parameter_combination}, Average Images per Second: {avg_speed}")
spark.stop()
import pickle
import os
from google.cloud import storage
os.makedirs('/tmp', exist_ok=True)
results_task2b = {
'2a iii results': finalresults,
'2a iv results': collected_results_by_parameter,
'2a v results': collected_averages
}
pickle_file_path = '/tmp/all_results.pkl'
with open(pickle_file_path, 'wb') as f:
pickle.dump(results_task2b, f)
def upload_to_bucket(blob_name, path_to_file, bucket_name):
"""Uploads a file to the specified Google Cloud Storage bucket."""
try:
client = storage.Client()
bucket = client.get_bucket(bucket_name)
blob = bucket.blob(blob_name)
blob.upload_from_filename(path_to_file)
print("File uploaded successfully to:", blob.public_url)
except Exception as e:
print(f"An error occurred: {e}")
bucket_name = 'hale-ripsaw-421615'
upload_to_bucket('results2b.pkl', '/tmp/all_results.pkl', 'hale-ripsaw-421615-storage')
Overwriting spark_job_2b.py
#2bii)creating a run cluster again
#cluster with 4 machines and double the resources
!gcloud dataproc clusters create task-2b-cluster \
--project=hale-ripsaw-421615 \
--region=us-east1 \
--image-version="1.4-ubuntu18" \
--master-machine-type=n1-standard-2 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=3 \
--worker-machine-type=n1-standard-2 \
--worker-boot-disk-type=pd-standard \
--worker-boot-disk-size=100 \
--initialization-actions=gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh \
--metadata 'PIP_PACKAGES=tensorflow==2.4.0 google-cloud-storage' \
--scopes=default
#CODE REFERENCES:
#https://cloud.google.com/dataproc/docs/guides/create-cluster
#https://blog.roundtableml.com/building-a-cluster-using-google-colab-in-5-minutes-3c77c1b1fc32
Waiting on operation [projects/hale-ripsaw-421615/regions/us-east1/operations/edc517ec-e218-3d8e-a958-434bcebebcf5]. WARNING: Don't create production clusters that reference initialization actions located in the gs://goog-dataproc-initialization-actions-REGION public buckets. These scripts are provided as reference implementations, and they are synchronized with ongoing GitHub repository changes—a new version of a initialization action in public buckets may break your cluster creation. Instead, copy the following initialization actions from public buckets into your bucket : gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh WARNING: Failed to validate permissions required for default service account: '126595473529-compute@developer.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. This could be due to Cloud Resource Manager API hasn't been enabled in your project '126595473529' before or it is disabled. Enable it by visiting 'https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=126595473529'. WARNING: For PD-Standard without local SSDs, we strongly recommend provisioning 1TB or larger to ensure consistently high I/O performance. See https://cloud.google.com/compute/docs/disks/performance for information on disk I/O performance. WARNING: The firewall rules for specified network or subnetwork would allow ingress traffic from 0.0.0.0/0, which could be a security risk. WARNING: The specified custom staging bucket 'dataproc-staging-us-east1-126595473529-r5gtifot' is not using uniform bucket level access IAM configuration. It is recommended to update bucket to enable the same. See https://cloud.google.com/storage/docs/uniform-bucket-level-access. Created [https://dataproc.googleapis.com/v1/projects/hale-ripsaw-421615/regions/us-east1/clusters/task-2b-cluster] Cluster placed in zone [us-east1-c].
#submitting the cluster
%%time
!gcloud dataproc jobs submit pyspark --cluster=task-2b-cluster --region=us-east1 --project=hale-ripsaw-421615 ./spark_job_2b.py
Job [158b731f85554644b21fd4a7c35b5a8e] submitted.
Waiting for job output...
2024-05-01 20:04:55.107228: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/lib/hadoop/lib/native
2024-05-01 20:04:55.107275: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
24/05/01 20:04:59 INFO org.apache.spark.SparkEnv: Registering MapOutputTracker
24/05/01 20:04:59 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster
24/05/01 20:04:59 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator
24/05/01 20:04:59 INFO org.spark_project.jetty.util.log: Logging initialized @6956ms to org.spark_project.jetty.util.log.Slf4jLog
24/05/01 20:04:59 INFO org.spark_project.jetty.server.Server: jetty-9.4.z-SNAPSHOT; built: unknown; git: unknown; jvm 1.8.0_312-b07
24/05/01 20:04:59 INFO org.spark_project.jetty.server.Server: Started @7105ms
24/05/01 20:04:59 INFO org.spark_project.jetty.server.AbstractConnector: Started ServerConnector@5c1ec6cc{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
24/05/01 20:05:00 WARN org.apache.spark.scheduler.FairSchedulableBuilder: Fair Scheduler configuration file not found so jobs will be scheduled in FIFO order. To use fair scheduling, configure pools in fairscheduler.xml or set spark.scheduler.allocation.file to a file that contains the configuration.
24/05/01 20:05:01 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at task-2b-cluster-m/10.142.0.56:8032
24/05/01 20:05:01 INFO org.apache.hadoop.yarn.client.AHSProxy: Connecting to Application History server at task-2b-cluster-m/10.142.0.56:10200
24/05/01 20:05:04 INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl: Submitted application application_1714593701338_0001
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 12.39
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 14.82
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 16.26
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 18.64
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 17.40
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 15.04
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 14.91
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 14.55
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 18.21
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 18.15
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 30.62
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 32.90
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 27.35
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 34.49
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 30.80
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 36.51
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 23.80
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 39.10
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 29.45
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 31.85
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 44.38
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 56.08
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 48.36
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 52.17
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 47.96
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 56.86
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 52.04
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 38.65
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 45.38
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 56.75
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 77.28
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 61.29
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 69.44
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 46.40
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 45.50
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 79.49
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 62.81
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 77.47
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 43.78
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 66.93
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 33.07
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 37.49
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 38.28
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 26.12
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 27.83
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 35.99
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 32.12
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 36.91
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 37.94
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 29.83
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 55.98
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 53.90
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 62.53
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 43.81
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 67.69
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 71.31
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 82.98
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 71.01
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 73.91
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 69.41
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 103.00
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 108.37
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 105.95
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 85.45
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 88.71
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 108.78
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 90.00
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 93.31
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 56.34
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 96.60
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 135.35
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 122.41
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 134.65
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 112.84
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 130.47
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 120.16
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 140.67
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 138.58
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 78.85
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 109.29
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 46.06
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 38.09
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 53.00
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 46.94
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 41.35
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 26.93
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 47.14
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 25.50
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 40.36
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 57.49
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 94.16
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 83.65
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 94.08
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 46.18
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 99.03
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 94.34
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 111.78
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 91.09
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 89.14
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 76.21
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 75.33
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 138.41
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 119.20
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 102.04
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 100.76
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 116.01
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 125.91
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 98.38
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 121.16
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 134.11
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 109.53
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 144.03
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 193.44
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 158.60
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 178.77
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 186.91
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 178.68
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 186.24
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 163.04
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 121.75
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 72.43
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 54.60
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 55.56
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 51.80
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 61.85
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 61.97
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 47.64
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 52.56
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 47.46
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 51.82
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 136.40
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 108.61
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 119.97
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 118.31
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 120.54
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 77.78
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 135.58
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 90.41
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 97.63
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 101.25
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 188.31
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 173.22
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 147.42
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 182.80
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 157.08
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 180.50
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 190.10
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 188.01
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 124.77
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 168.91
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 236.54
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 135.90
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 238.67
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 211.56
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 191.41
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 227.49
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 210.47
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 213.14
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 141.03
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 232.40
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 6.18
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 5.88
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 6.25
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 5.21
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 6.18
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 5.79
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 5.75
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 5.22
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 5.81
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 5.16
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 6.62
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 6.01
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 6.78
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 6.98
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 6.84
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 7.08
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 7.23
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 7.14
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 6.84
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 6.37
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 6.49
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 7.79
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 8.96
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 7.73
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 8.49
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 8.06
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 8.38
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 8.21
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 8.68
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 7.96
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 8.29
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 8.10
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 7.80
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 8.42
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 8.78
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 7.94
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 7.98
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 8.46
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 7.84
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 8.83
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 7.36
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 7.60
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 7.43
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 7.60
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 8.01
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 8.39
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 7.63
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 7.00
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 8.21
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 7.78
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 8.00
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 8.33
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 7.92
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 8.28
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 8.13
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 8.42
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 7.74
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 7.79
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 8.04
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 8.11
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 8.33
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 8.56
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 8.49
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 8.19
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 8.46
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 8.53
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 8.18
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 8.64
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 8.23
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 8.45
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 8.80
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 8.79
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 8.30
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 8.32
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 8.12
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 8.50
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 7.86
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 8.61
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 8.43
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 8.19
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 7.49
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 7.70
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 7.43
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 7.64
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 8.37
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 7.73
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 7.77
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 8.10
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 7.65
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 8.21
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 8.16
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 8.61
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 7.95
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 7.88
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 8.15
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 8.39
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 8.31
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 8.07
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 8.55
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 9.09
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 8.66
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 8.56
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 8.45
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 8.59
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 8.64
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 8.77
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 8.33
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 8.08
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 8.19
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 8.35
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 8.49
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 8.57
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 8.44
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 8.45
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 8.45
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 8.92
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 8.70
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 7.98
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 8.68
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 8.65
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 8.48
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 8.27
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 8.32
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 6.28
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 8.65
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 6.64
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 8.14
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 7.95
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 8.33
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 8.91
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 8.58
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 8.97
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 8.34
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 8.10
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 8.62
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 8.49
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 8.32
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 8.16
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 8.78
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 8.88
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 8.33
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 8.12
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 8.12
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 8.83
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 8.76
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 8.32
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 8.59
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 8.66
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 8.81
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 8.67
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 8.81
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 8.68
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 8.63
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 8.96
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 8.66
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 8.79
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 8.57
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 8.25
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 8.64
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 8.96
Parameter Combination: ((6, 3, 3), 7.479370808316229), Results: ['Image']
Parameter Combination: ((6, 3, 4), 8.23078363826773), Results: ['Image']
Parameter Combination: ((6, 6, 3), 8.27299111078432), Results: ['Image']
Parameter Combination: ((6, 6, 3), 8.153761547948964), Results: ['Image']
Parameter Combination: ((6, 6, 3), 8.627859502659813), Results: ['Image']
Parameter Combination: ((6, 9, 2), 8.42692021247563), Results: ['Image']
Parameter Combination: ((6, 9, 2), 8.69142230352737), Results: ['Image']
Parameter Combination: ((6, 9, 3), 9.07500617541793), Results: ['Image']
Parameter Combination: ((6, 12, 1), 8.766546736098107), Results: ['Image']
Parameter Combination: ((8, 3, 2), 8.544610514416075), Results: ['Image']
Parameter Combination: ((8, 3, 2), 8.245865877265132), Results: ['Image']
Parameter Combination: ((8, 3, 3), 9.059585025912481), Results: ['Image']
Parameter Combination: ((8, 6, 1), 8.459165902795215), Results: ['Image']
Parameter Combination: ((8, 9, 4), 8.47770324479236), Results: ['Image']
Parameter Combination: ((8, 9, 4), 8.63756073524006), Results: ['Image']
Parameter Combination: ((8, 9, 4), 8.647211507338463), Results: ['Image']
Parameter Combination: ((8, 9, 4), 8.466728386136788), Results: ['Image']
Parameter Combination: ((8, 12, 3), 8.817343811345502), Results: ['Image']
Parameter Combination: ((8, 12, 3), 8.813720936402234), Results: ['Image']
Parameter Combination: ((8, 12, 3), 8.708834003517852), Results: ['Image']
Parameter Combination: ((6, 3, 4), 44.07504801714022), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 44.66153820671117), Results: ['TFRecord']
Parameter Combination: ((6, 6, 3), 88.49645005995689), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 95.81329108100682), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 59.98666106242715), Results: ['TFRecord']
Parameter Combination: ((6, 9, 3), 133.1305934355309), Results: ['TFRecord']
Parameter Combination: ((6, 12, 2), 175.72120141466124), Results: ['TFRecord']
Parameter Combination: ((6, 12, 2), 151.7362514564907), Results: ['TFRecord']
Parameter Combination: ((6, 12, 3), 226.0261241059694), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 205.14474601279005), Results: ['TFRecord']
Parameter Combination: ((8, 3, 1), 63.10909378158173), Results: ['TFRecord']
Parameter Combination: ((8, 3, 2), 52.032862437390484), Results: ['TFRecord']
Parameter Combination: ((8, 3, 3), 81.61937395303431), Results: ['TFRecord']
Parameter Combination: ((8, 3, 3), 69.83571592099513), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 34.483297078984236), Results: ['TFRecord']
Parameter Combination: ((8, 6, 1), 88.01862793017848), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 153.31447705193804), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 129.35434940722027), Results: ['TFRecord']
Parameter Combination: ((8, 9, 2), 202.78120920738095), Results: ['TFRecord']
Parameter Combination: ((8, 9, 3), 159.58947562004172), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 207.87550180899044), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 247.08136653661734), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 235.53484911323426), Results: ['TFRecord']
Parameter Combination: ((2, 3, 2), 6.77407497133259), Results: ['Image']
Parameter Combination: ((2, 3, 3), 7.78609408597992), Results: ['Image']
Parameter Combination: ((2, 3, 3), 7.678947800426516), Results: ['Image']
Parameter Combination: ((2, 6, 3), 8.243823108712206), Results: ['Image']
Parameter Combination: ((2, 6, 3), 8.05203817241836), Results: ['Image']
Parameter Combination: ((2, 6, 4), 7.899668548106354), Results: ['Image']
Parameter Combination: ((2, 6, 4), 7.821624927058315), Results: ['Image']
Parameter Combination: ((2, 9, 1), 7.867449769861573), Results: ['Image']
Parameter Combination: ((2, 9, 2), 8.702875607074718), Results: ['Image']
Parameter Combination: ((2, 9, 2), 8.320607373980181), Results: ['Image']
Parameter Combination: ((2, 12, 1), 8.648686247776146), Results: ['Image']
Parameter Combination: ((4, 3, 1), 7.71238245054499), Results: ['Image']
Parameter Combination: ((4, 3, 2), 8.34102799596833), Results: ['Image']
Parameter Combination: ((4, 3, 2), 8.180663709176445), Results: ['Image']
Parameter Combination: ((4, 6, 1), 8.193872427879027), Results: ['Image']
Parameter Combination: ((4, 9, 4), 8.397437905958116), Results: ['Image']
Parameter Combination: ((4, 9, 4), 8.315945119533323), Results: ['Image']
Parameter Combination: ((4, 9, 4), 8.850847960142417), Results: ['Image']
Parameter Combination: ((4, 12, 3), 8.495046329019182), Results: ['Image']
Parameter Combination: ((4, 12, 3), 8.715274273454032), Results: ['Image']
Parameter Combination: ((4, 12, 3), 8.93920412429616), Results: ['Image']
Parameter Combination: ((2, 3, 3), 11.886758070237505), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 12.724220834477288), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 16.155062984387268), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 42.89209918121638), Results: ['TFRecord']
Parameter Combination: ((2, 12, 2), 59.12991296451088), Results: ['TFRecord']
Parameter Combination: ((2, 12, 2), 55.20222293268522), Results: ['TFRecord']
Parameter Combination: ((4, 6, 2), 67.00215190606427), Results: ['TFRecord']
Parameter Combination: ((4, 6, 3), 66.92339695922699), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 61.047831769182956), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 25.12232469479097), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 57.59178339882234), Results: ['TFRecord']
Parameter Combination: ((4, 9, 3), 91.31606212603006), Results: ['TFRecord']
Parameter Combination: ((4, 9, 3), 99.56574955408217), Results: ['TFRecord']
Parameter Combination: ((4, 12, 1), 126.83404196877385), Results: ['TFRecord']
Parameter Combination: ((4, 12, 3), 132.79802854285782), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 131.75660250297935), Results: ['TFRecord']
Parameter Combination: ((6, 3, 1), 50.96992741099205), Results: ['TFRecord']
Parameter Combination: ((6, 3, 3), 44.47749098490601), Results: ['TFRecord']
Parameter Combination: ((6, 3, 3), 52.699249621320526), Results: ['TFRecord']
Parameter Combination: ((6, 3, 3), 48.19023460813006), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 137.52025136993578), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 137.40845408796255), Results: ['TFRecord']
Parameter Combination: ((6, 12, 1), 167.1013409501634), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 190.35659522592366), Results: ['TFRecord']
Parameter Combination: ((8, 3, 2), 71.49879466042381), Results: ['TFRecord']
Parameter Combination: ((8, 3, 3), 62.56762253305421), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 73.49649322373715), Results: ['TFRecord']
Parameter Combination: ((8, 6, 2), 136.30261276485118), Results: ['TFRecord']
Parameter Combination: ((8, 9, 3), 180.90105399358438), Results: ['TFRecord']
Parameter Combination: ((8, 9, 3), 196.96743993107214), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 131.16194612624977), Results: ['TFRecord']
Parameter Combination: ((8, 12, 2), 226.0236288672525), Results: ['TFRecord']
Parameter Combination: ((8, 12, 2), 278.7893196112697), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 15.353543340233507), Results: ['TFRecord']
Parameter Combination: ((2, 6, 1), 25.66435407796446), Results: ['TFRecord']
Parameter Combination: ((2, 6, 2), 26.641284964549143), Results: ['TFRecord']
Parameter Combination: ((2, 6, 3), 23.95876922696109), Results: ['TFRecord']
Parameter Combination: ((2, 6, 3), 27.162220008397185), Results: ['TFRecord']
Parameter Combination: ((2, 6, 3), 27.860614031591673), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 24.75937411453578), Results: ['TFRecord']
Parameter Combination: ((2, 9, 2), 43.499325017673996), Results: ['TFRecord']
Parameter Combination: ((2, 9, 3), 42.92597324399883), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 33.01590589058468), Results: ['TFRecord']
Parameter Combination: ((2, 12, 3), 61.37182573069466), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 42.93450505805309), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 33.38151574842317), Results: ['TFRecord']
Parameter Combination: ((4, 6, 2), 64.0494359431171), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 66.08169020741593), Results: ['TFRecord']
Parameter Combination: ((4, 9, 2), 93.8334121518959), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 79.39334303962596), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 7.72773312204014), Results: ['Image']
Parameter Combination: ((6, 3, 4), 7.9868676688282), Results: ['Image']
Parameter Combination: ((6, 6, 4), 8.337101847955655), Results: ['Image']
Parameter Combination: ((6, 6, 4), 8.372484455490826), Results: ['Image']
Parameter Combination: ((6, 6, 4), 8.88584351223136), Results: ['Image']
Parameter Combination: ((6, 9, 1), 8.272168345613927), Results: ['Image']
Parameter Combination: ((6, 12, 2), 8.534754046294225), Results: ['Image']
Parameter Combination: ((6, 12, 2), 8.879540269049082), Results: ['Image']
Parameter Combination: ((8, 3, 1), 8.420482332455789), Results: ['Image']
Parameter Combination: ((8, 6, 2), 8.852153994647727), Results: ['Image']
Parameter Combination: ((8, 6, 2), 8.607660036437274), Results: ['Image']
Parameter Combination: ((8, 9, 3), 8.533682257708143), Results: ['Image']
Parameter Combination: ((8, 9, 3), 8.55720563084118), Results: ['Image']
Parameter Combination: ((8, 9, 3), 8.684824443480391), Results: ['Image']
Parameter Combination: ((8, 12, 1), 9.027642055937353), Results: ['Image']
Parameter Combination: ((8, 12, 4), 8.331323382544756), Results: ['Image']
Parameter Combination: ((8, 12, 4), 8.653281969513953), Results: ['Image']
Parameter Combination: ((8, 12, 4), 8.44287351415303), Results: ['Image']
Parameter Combination: ((8, 12, 4), 8.770213510591672), Results: ['Image']
Parameter Combination: ((2, 3, 1), 6.621957919776022), Results: ['Image']
Parameter Combination: ((2, 3, 4), 7.1645454157236195), Results: ['Image']
Parameter Combination: ((2, 3, 4), 7.463378004382089), Results: ['Image']
Parameter Combination: ((2, 3, 4), 7.505867896278357), Results: ['Image']
Parameter Combination: ((2, 3, 4), 7.58215941506753), Results: ['Image']
Parameter Combination: ((2, 6, 4), 8.885482712361467), Results: ['Image']
Parameter Combination: ((2, 6, 4), 8.165002599640024), Results: ['Image']
Parameter Combination: ((2, 12, 2), 8.443790280430182), Results: ['Image']
Parameter Combination: ((2, 12, 2), 8.127433598595275), Results: ['Image']
Parameter Combination: ((4, 6, 2), 8.731173405782526), Results: ['Image']
Parameter Combination: ((4, 6, 3), 9.067690353107686), Results: ['Image']
Parameter Combination: ((4, 9, 2), 9.417032727093112), Results: ['Image']
Parameter Combination: ((4, 9, 3), 8.28958840595814), Results: ['Image']
Parameter Combination: ((4, 9, 3), 8.650072789076209), Results: ['Image']
Parameter Combination: ((4, 9, 3), 8.11320611973301), Results: ['Image']
Parameter Combination: ((4, 12, 1), 9.000275337178516), Results: ['Image']
Parameter Combination: ((4, 12, 4), 8.938777858841197), Results: ['Image']
Parameter Combination: ((4, 12, 4), 8.924745342556568), Results: ['Image']
Parameter Combination: ((2, 6, 1), 8.042402671019296), Results: ['Image']
Parameter Combination: ((2, 6, 2), 7.799196707492438), Results: ['Image']
Parameter Combination: ((2, 6, 2), 7.836639519845994), Results: ['Image']
Parameter Combination: ((2, 9, 4), 8.43141711516607), Results: ['Image']
Parameter Combination: ((2, 9, 4), 8.183732795971084), Results: ['Image']
Parameter Combination: ((2, 12, 3), 8.708410590623894), Results: ['Image']
Parameter Combination: ((2, 12, 3), 8.515094765604442), Results: ['Image']
Parameter Combination: ((2, 12, 3), 8.242570936316719), Results: ['Image']
Parameter Combination: ((4, 3, 3), 7.9667247782195325), Results: ['Image']
Parameter Combination: ((4, 3, 3), 7.806895404986695), Results: ['Image']
Parameter Combination: ((4, 3, 3), 7.6360857489331755), Results: ['Image']
Parameter Combination: ((4, 3, 4), 8.341686016159105), Results: ['Image']
Parameter Combination: ((4, 3, 4), 8.731864885190927), Results: ['Image']
Parameter Combination: ((4, 3, 4), 8.10525112250751), Results: ['Image']
Parameter Combination: ((4, 6, 2), 9.04283527891059), Results: ['Image']
Parameter Combination: ((4, 6, 3), 8.551733020000936), Results: ['Image']
Parameter Combination: ((4, 9, 2), 8.557649145266254), Results: ['Image']
Parameter Combination: ((4, 12, 4), 9.187487190898205), Results: ['Image']
Parameter Combination: ((4, 12, 4), 9.02661194084992), Results: ['Image']
Parameter Combination: ((6, 3, 1), 7.421568547459964), Results: ['Image']
Parameter Combination: ((6, 3, 4), 6.633536417137766), Results: ['Image']
Parameter Combination: ((6, 6, 1), 8.78987098191211), Results: ['Image']
Parameter Combination: ((6, 6, 4), 9.028188442898054), Results: ['Image']
Parameter Combination: ((6, 9, 4), 8.384197911898342), Results: ['Image']
Parameter Combination: ((6, 9, 4), 8.805850733149528), Results: ['Image']
Parameter Combination: ((6, 9, 4), 8.456038644457218), Results: ['Image']
Parameter Combination: ((6, 9, 4), 8.538461799452298), Results: ['Image']
Parameter Combination: ((6, 12, 3), 8.604996900957614), Results: ['Image']
Parameter Combination: ((6, 12, 3), 8.495304063442804), Results: ['Image']
Parameter Combination: ((6, 12, 3), 8.585366719019257), Results: ['Image']
Parameter Combination: ((8, 3, 4), 8.152323105199669), Results: ['Image']
Parameter Combination: ((8, 3, 4), 8.586734007113124), Results: ['Image']
Parameter Combination: ((8, 3, 4), 8.447012757961737), Results: ['Image']
Parameter Combination: ((8, 3, 4), 8.665451855892039), Results: ['Image']
Parameter Combination: ((8, 6, 3), 8.949229498880895), Results: ['Image']
Parameter Combination: ((8, 6, 3), 8.59471242701703), Results: ['Image']
Parameter Combination: ((8, 6, 3), 8.931139363932234), Results: ['Image']
Parameter Combination: ((8, 9, 2), 8.694162656013983), Results: ['Image']
Parameter Combination: ((8, 9, 2), 8.62657346684517), Results: ['Image']
Parameter Combination: ((2, 3, 1), 15.318636689018422), Results: ['TFRecord']
Parameter Combination: ((2, 3, 2), 16.581488114298818), Results: ['TFRecord']
Parameter Combination: ((2, 3, 3), 17.286748679580185), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 14.408711932530617), Results: ['TFRecord']
Parameter Combination: ((2, 6, 2), 31.90913327031597), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 29.769163752246808), Results: ['TFRecord']
Parameter Combination: ((2, 9, 1), 41.598443119249374), Results: ['TFRecord']
Parameter Combination: ((2, 9, 2), 38.6312277671119), Results: ['TFRecord']
Parameter Combination: ((2, 9, 3), 43.11381972680342), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 48.32503160434876), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 32.878923555902794), Results: ['TFRecord']
Parameter Combination: ((2, 12, 1), 74.28460862384631), Results: ['TFRecord']
Parameter Combination: ((2, 12, 3), 72.37839734482223), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 51.97239037803952), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 59.68422587955162), Results: ['TFRecord']
Parameter Combination: ((4, 3, 2), 30.29322496421869), Results: ['TFRecord']
Parameter Combination: ((4, 3, 3), 39.175091279721855), Results: ['TFRecord']
Parameter Combination: ((4, 3, 3), 27.17584458064018), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 32.790500773317106), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 28.855554956766817), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 28.96790498055536), Results: ['TFRecord']
Parameter Combination: ((4, 6, 1), 54.27950495433898), Results: ['TFRecord']
Parameter Combination: ((4, 6, 3), 64.27522637024153), Results: ['TFRecord']
Parameter Combination: ((4, 6, 3), 68.36351683666436), Results: ['TFRecord']
Parameter Combination: ((4, 9, 3), 93.37506122146091), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 102.14998690948057), Results: ['TFRecord']
Parameter Combination: ((4, 12, 2), 131.20824814830505), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 129.00994071965607), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 149.6973301182029), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 109.08604793300303), Results: ['TFRecord']
Parameter Combination: ((6, 3, 2), 52.963659399294826), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 46.8862290844707), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 50.69819595676743), Results: ['TFRecord']
Parameter Combination: ((6, 6, 1), 120.05621681447593), Results: ['TFRecord']
Parameter Combination: ((6, 6, 2), 103.1879614569808), Results: ['TFRecord']
Parameter Combination: ((6, 6, 3), 78.8427295953666), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 113.84803718657754), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 101.30604911293855), Results: ['TFRecord']
Parameter Combination: ((6, 9, 2), 130.2049465739431), Results: ['TFRecord']
Parameter Combination: ((6, 9, 3), 159.60949401743855), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 156.1897096153329), Results: ['TFRecord']
Parameter Combination: ((6, 12, 3), 180.356860538867), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 79.16845382764765), Results: ['TFRecord']
Parameter Combination: ((8, 6, 2), 129.2935404154315), Results: ['TFRecord']
Parameter Combination: ((8, 6, 3), 128.8257684053182), Results: ['TFRecord']
Parameter Combination: ((8, 6, 3), 132.05120784987636), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 127.9007930961753), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 139.12600054869077), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 194.446554381826), Results: ['TFRecord']
Parameter Combination: ((8, 12, 3), 238.93282696866572), Results: ['TFRecord']
Parameter Combination: ((8, 12, 3), 270.31631693322134), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 257.09663730601375), Results: ['TFRecord']
Parameter Combination: ((6, 3, 2), 7.131189182143282), Results: ['Image']
Parameter Combination: ((6, 3, 2), 7.3248813984375065), Results: ['Image']
Parameter Combination: ((6, 3, 3), 6.9646401222275305), Results: ['Image']
Parameter Combination: ((6, 3, 3), 6.9985777116109364), Results: ['Image']
Parameter Combination: ((6, 6, 2), 8.31417946542551), Results: ['Image']
Parameter Combination: ((6, 6, 2), 8.75096707219581), Results: ['Image']
Parameter Combination: ((6, 9, 3), 8.47954896423989), Results: ['Image']
Parameter Combination: ((6, 9, 3), 8.865939684852068), Results: ['Image']
Parameter Combination: ((6, 12, 4), 8.55843807922834), Results: ['Image']
Parameter Combination: ((6, 12, 4), 8.475820663030643), Results: ['Image']
Parameter Combination: ((6, 12, 4), 8.537077741854889), Results: ['Image']
Parameter Combination: ((6, 12, 4), 8.838312899220865), Results: ['Image']
Parameter Combination: ((8, 3, 3), 8.239980046574908), Results: ['Image']
Parameter Combination: ((8, 3, 3), 8.701644588097464), Results: ['Image']
Parameter Combination: ((8, 6, 4), 8.739881309595253), Results: ['Image']
Parameter Combination: ((8, 6, 4), 8.099673412646542), Results: ['Image']
Parameter Combination: ((8, 6, 4), 8.153049416828214), Results: ['Image']
Parameter Combination: ((8, 6, 4), 8.795511832048795), Results: ['Image']
Parameter Combination: ((8, 9, 1), 8.463152386571185), Results: ['Image']
Parameter Combination: ((8, 12, 2), 8.38824992658126), Results: ['Image']
Parameter Combination: ((8, 12, 2), 8.59525383933067), Results: ['Image']
Parameter Combination: ((2, 3, 2), 7.094518215808939), Results: ['Image']
Parameter Combination: ((2, 3, 3), 6.513243333687907), Results: ['Image']
Parameter Combination: ((2, 6, 3), 9.016507030334276), Results: ['Image']
Parameter Combination: ((2, 9, 3), 8.36275500749184), Results: ['Image']
Parameter Combination: ((2, 9, 3), 8.345021950353305), Results: ['Image']
Parameter Combination: ((2, 9, 3), 8.001536346420682), Results: ['Image']
Parameter Combination: ((2, 9, 4), 7.64612275425602), Results: ['Image']
Parameter Combination: ((2, 9, 4), 7.403752602432631), Results: ['Image']
Parameter Combination: ((2, 12, 4), 8.568257950425066), Results: ['Image']
Parameter Combination: ((2, 12, 4), 8.029027341428513), Results: ['Image']
Parameter Combination: ((2, 12, 4), 8.745602016722266), Results: ['Image']
Parameter Combination: ((2, 12, 4), 8.309482339337382), Results: ['Image']
Parameter Combination: ((4, 3, 4), 7.871620928411101), Results: ['Image']
Parameter Combination: ((4, 6, 3), 7.775861075419057), Results: ['Image']
Parameter Combination: ((4, 6, 4), 8.626609691429264), Results: ['Image']
Parameter Combination: ((4, 6, 4), 8.293753037654433), Results: ['Image']
Parameter Combination: ((4, 6, 4), 8.894909982411347), Results: ['Image']
Parameter Combination: ((4, 6, 4), 8.633099537167467), Results: ['Image']
Parameter Combination: ((4, 9, 1), 8.436037276241983), Results: ['Image']
Parameter Combination: ((4, 9, 4), 9.014991656972738), Results: ['Image']
Parameter Combination: ((4, 12, 2), 8.61268125737949), Results: ['Image']
Parameter Combination: ((4, 12, 2), 8.793992744713053), Results: ['Image']
Parameter Combination: ((6, 3, 2), 39.39910542770857), Results: ['TFRecord']
Parameter Combination: ((6, 6, 2), 88.2746028386789), Results: ['TFRecord']
Parameter Combination: ((6, 6, 3), 29.11505285137502), Results: ['TFRecord']
Parameter Combination: ((6, 9, 1), 134.1190164039267), Results: ['TFRecord']
Parameter Combination: ((6, 9, 2), 121.86505293640046), Results: ['TFRecord']
Parameter Combination: ((6, 9, 3), 112.21167248551976), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 167.3389380825197), Results: ['TFRecord']
Parameter Combination: ((6, 12, 3), 187.0173925806106), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 184.42344552394806), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 75.73566065275291), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 63.803583177093834), Results: ['TFRecord']
Parameter Combination: ((8, 6, 3), 131.80861795345865), Results: ['TFRecord']
Parameter Combination: ((8, 9, 1), 204.15495474300965), Results: ['TFRecord']
Parameter Combination: ((8, 9, 2), 139.72849566595812), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 177.72673305551322), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 165.8430369403022), Results: ['TFRecord']
Parameter Combination: ((8, 12, 1), 135.38906909613002), Results: ['TFRecord']
Parameter Combination: ((8, 12, 3), 165.71494702843123), Results: ['TFRecord']
Parameter Combination: ((2, 3, 2), 19.612565347099476), Results: ['TFRecord']
Parameter Combination: ((2, 3, 3), 18.787041136039406), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 26.766486669311497), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 22.480555380618224), Results: ['TFRecord']
Parameter Combination: ((2, 9, 3), 44.00196529265201), Results: ['TFRecord']
Parameter Combination: ((2, 12, 3), 63.46427965735707), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 72.6748883488627), Results: ['TFRecord']
Parameter Combination: ((4, 3, 1), 34.140371821447566), Results: ['TFRecord']
Parameter Combination: ((4, 3, 2), 29.193472198376867), Results: ['TFRecord']
Parameter Combination: ((4, 3, 3), 32.057496514426674), Results: ['TFRecord']
Parameter Combination: ((4, 9, 1), 92.62152473629585), Results: ['TFRecord']
Parameter Combination: ((4, 9, 2), 103.02588560878056), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 93.57226499561249), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 81.7594264736141), Results: ['TFRecord']
Parameter Combination: ((4, 12, 2), 120.5556395880452), Results: ['TFRecord']
Parameter Combination: ((4, 12, 3), 105.25493738864212), Results: ['TFRecord']
Parameter Combination: ((4, 12, 3), 125.26573734628508), Results: ['TFRecord']
24/05/01 20:22:44 INFO org.spark_project.jetty.server.AbstractConnector: Stopped Spark@5c1ec6cc{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
24/05/01 20:22:45 INFO org.apache.spark.SparkEnv: Registering MapOutputTracker
24/05/01 20:22:45 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster
24/05/01 20:22:45 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator
24/05/01 20:22:45 INFO org.spark_project.jetty.server.Server: jetty-9.4.z-SNAPSHOT; built: unknown; git: unknown; jvm 1.8.0_312-b07
24/05/01 20:22:45 INFO org.spark_project.jetty.server.Server: Started @1072974ms
24/05/01 20:22:45 INFO org.spark_project.jetty.server.AbstractConnector: Started ServerConnector@68830ff3{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
24/05/01 20:22:45 WARN org.apache.spark.scheduler.FairSchedulableBuilder: Fair Scheduler configuration file not found so jobs will be scheduled in FIFO order. To use fair scheduling, configure pools in fairscheduler.xml or set spark.scheduler.allocation.file to a file that contains the configuration.
24/05/01 20:22:45 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at task-2b-cluster-m/10.142.0.56:8032
24/05/01 20:22:45 INFO org.apache.hadoop.yarn.client.AHSProxy: Connecting to Application History server at task-2b-cluster-m/10.142.0.56:10200
24/05/01 20:22:46 INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl: Submitted application application_1714593701338_0002
Parameter Combination: (2, 3, 2), Average Images per Second: 3.0
Parameter Combination: (2, 3, 4), Average Images per Second: 1.5
Parameter Combination: (2, 6, 1), Average Images per Second: 12.0
Parameter Combination: (2, 6, 3), Average Images per Second: 4.0
Parameter Combination: (2, 9, 2), Average Images per Second: 9.0
Parameter Combination: (2, 9, 4), Average Images per Second: 4.5
Parameter Combination: (2, 12, 1), Average Images per Second: 24.0
Parameter Combination: (2, 12, 3), Average Images per Second: 8.0
Parameter Combination: (4, 3, 2), Average Images per Second: 6.0
Parameter Combination: (4, 3, 4), Average Images per Second: 3.0
Parameter Combination: (4, 6, 1), Average Images per Second: 24.0
Parameter Combination: (4, 6, 3), Average Images per Second: 8.0
Parameter Combination: (4, 9, 2), Average Images per Second: 18.0
Parameter Combination: (4, 9, 4), Average Images per Second: 9.0
Parameter Combination: (4, 12, 1), Average Images per Second: 48.0
Parameter Combination: (4, 12, 3), Average Images per Second: 16.0
Parameter Combination: (6, 3, 2), Average Images per Second: 9.0
Parameter Combination: (6, 3, 4), Average Images per Second: 4.5
Parameter Combination: (6, 6, 1), Average Images per Second: 36.0
Parameter Combination: (6, 6, 3), Average Images per Second: 12.0
Parameter Combination: (6, 9, 2), Average Images per Second: 27.0
Parameter Combination: (6, 9, 4), Average Images per Second: 13.5
Parameter Combination: (6, 12, 1), Average Images per Second: 72.0
Parameter Combination: (6, 12, 3), Average Images per Second: 24.0
Parameter Combination: (8, 3, 2), Average Images per Second: 12.0
Parameter Combination: (8, 3, 4), Average Images per Second: 6.0
Parameter Combination: (8, 6, 1), Average Images per Second: 48.0
Parameter Combination: (8, 6, 3), Average Images per Second: 16.0
Parameter Combination: (8, 9, 2), Average Images per Second: 36.0
Parameter Combination: (8, 9, 4), Average Images per Second: 18.0
Parameter Combination: (8, 12, 1), Average Images per Second: 96.0
Parameter Combination: (8, 12, 3), Average Images per Second: 32.0
Parameter Combination: (6, 3, 1), Average Images per Second: 18.0
Parameter Combination: (6, 3, 3), Average Images per Second: 6.0
Parameter Combination: (6, 6, 2), Average Images per Second: 18.0
Parameter Combination: (6, 6, 4), Average Images per Second: 9.0
Parameter Combination: (6, 9, 1), Average Images per Second: 54.0
Parameter Combination: (6, 9, 3), Average Images per Second: 18.0
Parameter Combination: (6, 12, 2), Average Images per Second: 36.0
Parameter Combination: (6, 12, 4), Average Images per Second: 18.0
Parameter Combination: (8, 3, 1), Average Images per Second: 24.0
Parameter Combination: (8, 3, 3), Average Images per Second: 8.0
Parameter Combination: (8, 6, 2), Average Images per Second: 24.0
Parameter Combination: (8, 6, 4), Average Images per Second: 12.0
Parameter Combination: (8, 9, 1), Average Images per Second: 72.0
Parameter Combination: (8, 9, 3), Average Images per Second: 24.0
Parameter Combination: (8, 12, 2), Average Images per Second: 48.0
Parameter Combination: (8, 12, 4), Average Images per Second: 24.0
Parameter Combination: (2, 3, 1), Average Images per Second: 6.0
Parameter Combination: (2, 3, 3), Average Images per Second: 2.0
Parameter Combination: (2, 6, 2), Average Images per Second: 6.0
Parameter Combination: (2, 6, 4), Average Images per Second: 3.0
Parameter Combination: (2, 9, 1), Average Images per Second: 18.0
Parameter Combination: (2, 9, 3), Average Images per Second: 6.0
Parameter Combination: (2, 12, 2), Average Images per Second: 12.0
Parameter Combination: (2, 12, 4), Average Images per Second: 6.0
Parameter Combination: (4, 3, 1), Average Images per Second: 12.0
Parameter Combination: (4, 3, 3), Average Images per Second: 4.0
Parameter Combination: (4, 6, 2), Average Images per Second: 12.0
Parameter Combination: (4, 6, 4), Average Images per Second: 6.0
Parameter Combination: (4, 9, 1), Average Images per Second: 36.0
Parameter Combination: (4, 9, 3), Average Images per Second: 12.0
Parameter Combination: (4, 12, 2), Average Images per Second: 24.0
Parameter Combination: (4, 12, 4), Average Images per Second: 12.0
24/05/01 20:22:57 INFO org.spark_project.jetty.server.AbstractConnector: Stopped Spark@68830ff3{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
File uploaded successfully to: https://storage.googleapis.com/hale-ripsaw-421615-storage/results2b.pkl
Job [158b731f85554644b21fd4a7c35b5a8e] finished successfully.
done: true
driverControlFilesUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/ee36ed48-a49a-40a3-b2c0-955d6f193f38/jobs/158b731f85554644b21fd4a7c35b5a8e/
driverOutputResourceUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/ee36ed48-a49a-40a3-b2c0-955d6f193f38/jobs/158b731f85554644b21fd4a7c35b5a8e/driveroutput
jobUuid: 6cd8fadc-04a9-3101-8400-f69f4cae5e49
placement:
clusterName: task-2b-cluster
clusterUuid: ee36ed48-a49a-40a3-b2c0-955d6f193f38
pysparkJob:
mainPythonFileUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/ee36ed48-a49a-40a3-b2c0-955d6f193f38/jobs/158b731f85554644b21fd4a7c35b5a8e/staging/spark_job_2b.py
reference:
jobId: 158b731f85554644b21fd4a7c35b5a8e
projectId: hale-ripsaw-421615
status:
state: DONE
stateStartTime: '2024-05-01T20:23:00.390856Z'
statusHistory:
- state: PENDING
stateStartTime: '2024-05-01T20:04:50.879612Z'
- state: SETUP_DONE
stateStartTime: '2024-05-01T20:04:50.908918Z'
- details: Agent reported job success
state: RUNNING
stateStartTime: '2024-05-01T20:04:51.214306Z'
yarnApplications:
- name: AverageReadingSpeeds
progress: 1.0
state: FINISHED
trackingUrl: http://task-2b-cluster-m:8088/proxy/application_1714593701338_0002/
- name: spark_job_2b.py
progress: 1.0
state: FINISHED
trackingUrl: http://task-2b-cluster-m:8088/proxy/application_1714593701338_0001/
CPU times: user 8.11 s, sys: 1.02 s, total: 9.13 s
Wall time: 18min 12s
If you implemented a straightfoward version of 2a), you will probably have an inefficiency in your code.
Because we are reading multiple times from an RDD to read the values for the different parameters and their averages, caching existing results is important. Explain where in the process caching can help, and add a call to RDD.cache() to your code, if you haven't yet. Measure the the effect of using caching or not using it.
Make the suitable change in the code you have written above and mark them up in comments as ### TASK 2c ###.
Explain in your report what the reasons for this change are and demonstrate and interpret its effect
#New filename argument
%%writefile spark_job_2c.py
import itertools
import time
import tensorflow as tf
import pyspark
from pyspark import SparkContext
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
PROJECT = 'hale-ripsaw-421615'
BUCKET = 'gs://{}-storage'.format(PROJECT)
GCS_OUTPUT = BUCKET + '/tfrecords-jpeg-192x192-2/flowers'
filenames = tf.io.gfile.glob(GCS_OUTPUT + "*.tfrec")
TARGET_SIZE = [192,192]
PARTITIONS = 16
import pyspark
from pyspark.sql import SQLContext
from pyspark.sql import Row
import tensorflow as tf
import itertools
TARGET_SIZE = [192, 192]
def read_tfrecord(recordstfrecords):
features = {
"image": tf.io.FixedLenFeature([], tf.string),
"class": tf.io.FixedLenFeature([], tf.int64)
}
example = tf.io.parse_single_example(recordstfrecords, features)
image = tf.image.decode_jpeg(example['image'], channels=3)
image = tf.reshape(image, [*TARGET_SIZE, 3])
class_num = example['class']
return image, class_num
def load_dataset(filenames):
option_no_order = tf.data.Options()
option_no_order.experimental_deterministic = False
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.with_options(option_no_order)
dataset2 = dataset.map(read_tfrecord)
return dataset2
def recompress_image(image, label):
uint8_image = tf.cast(image, tf.uint8)
jpeg_image = tf.image.encode_jpeg(uint8_image, optimize_size=True, chroma_downsampling=False)
return jpeg_image, label
def resize_and_crop_image(image, label):
image_width = tf.shape(image)[0]
image_height = tf.shape(image)[1]
target_width = TARGET_SIZE[1]
target_height = TARGET_SIZE[0]
resize_crit = (image_width * target_height) / (image_height * target_width)
image = tf.cond(resize_crit < 1,
lambda: tf.image.resize(image, [target_width, image_width * target_width // image_width]),
lambda: tf.image.resize(image, [target_height, image_height * target_height // image_height]))
new_width = tf.shape(image)[0]
new_height = tf.shape(image)[1]
image = tf.image.crop_to_bounding_box(image, (new_height - target_height) // 2, (new_width - target_width) // 2, target_width, target_height)
return image, label
def decode_jpeg_and_label(filepath):
image_data = tf.io.read_file(filepath)
decoded_image = tf.image.decode_jpeg(image_data)
label = tf.strings.split(tf.expand_dims(filepath, axis=-1), sep='/')
class_label = label.values[-2]
return decoded_image, class_label
def load_image_jpeg_dataset():
GCS_PATTERN = 'gs://flowers-public/*/*.jpg'
files_dataset = tf.data.Dataset.list_files(GCS_PATTERN)
decoded_images_dataset = files_dataset.map(decode_jpeg_and_label)
resized_dataset = decoded_images_dataset.map(resize_and_crop_image)
image_jpeg_dataset = resized_dataset.map(recompress_image)
return image_jpeg_dataset
def parameter_combinations(batch_sizes, batch_numbers, repetitions):
return list(itertools.product(batch_sizes, batch_numbers, repetitions))
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
sc = SparkContext.getOrCreate()
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
parameters.cache()
def time_configs(params):
batch_size, batch_number, repetition = params
TRF_dataset = load_dataset(filenames)
results = []
for repet in range(repetition):
start_time = time.time()
for _ in TRF_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
results.append(('TFRecord', params, images_per_second))
return results
def image_configs(params):
batch_size, batch_number, repetition = params
img_dataset = load_image_jpeg_dataset()
image_processing_results = []
for rep in range(repetition):
start_time = time.time()
for _ in img_dataset.batch(batch_size).take(batch_number):
pass
total_time = time.time() - start_time
images_per_second = (batch_size * batch_number) / total_time
image_processing_results.append(('Image', params, images_per_second))
return image_processing_results
resultsrdd = parameters.flatMap(time_configs)
resultsrdd2 = parameters.flatMap(image_configs)
combinedrddresults = resultsrdd.union(resultsrdd2)
finalresults = combinedrddresults.collect()
for result in finalresults:
result_type, params, images_per_second = result
batch_size, batch_number, repetition = params
print(f"Result Type: {result_type}, Batch Size: {batch_size}, Batch Number: {batch_number}, Repetition: {repetition}, Images/Sec: {images_per_second:.2f}")
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("ImageProcessingAggregation").getOrCreate()
sc = spark.sparkContext
parameters = sc.parallelize(parameter_combinations(batch_sizes, batch_numbers, repetitions))
parameters.cache()
results_rdd = parameters.flatMap(time_configs)
results_rdd2 = parameters.flatMap(image_configs)
combined_rdd_results = results_rdd.union(results_rdd2)
result_rdd_grouped = combined_rdd_results.map(lambda x: ((x[1], x[2]), x[0]))
collected_results_by_parameter = result_rdd_grouped.groupByKey().mapValues(list).collect()
for params, values in collected_results_by_parameter:
print(f"Parameter Combination: {params}, Results: {list(values)}")
spark.stop()
from pyspark.sql import SparkSession
import itertools
spark = SparkSession.builder.appName("AverageReadingSpeeds").getOrCreate()
sc = spark.sparkContext
batch_sizes = [2, 4, 6, 8]
batch_numbers = [3, 6, 9, 12]
repetitions = [1, 2, 3, 4]
parameter_combinations = list(itertools.product(batch_sizes, batch_numbers, repetitions))
data = [((bs, bn, rep), bs * bn / rep) for bs, bn, rep in parameter_combinations]
combined_rdd_results = sc.parallelize(data)
zero_value = (0.0, 0)
def seq_op(accumulator, element):
(sum, count) = accumulator
return (sum + element, count + 1)
def comb_op(accumulator1, accumulator2):
(sum1, count1) = accumulator1
(sum2, count2) = accumulator2
return (sum1 + sum2, count1 + count2)
average_speeds_rdd = combined_rdd_results.aggregateByKey(zero_value, seq_op, comb_op)
average_speeds_rdd = average_speeds_rdd.mapValues(lambda x: x[0] / x[1])
collected_averages = average_speeds_rdd.collect()
for parameter_combination, avg_speed in collected_averages:
print(f"Parameter Combination: {parameter_combination}, Average Images per Second: {avg_speed}")
spark.stop()
import pickle
import os
from google.cloud import storage
os.makedirs('/tmp', exist_ok=True)
results_task2c = {
'2a iii results': finalresults,
'2a iv results': collected_results_by_parameter,
'2a v results': collected_averages
}
pickle_file_path = '/tmp/all_results.pkl'
with open(pickle_file_path, 'wb') as f:
pickle.dump(results_task2c, f)
def upload_to_bucket(blob_name, path_to_file, bucket_name):
"""Uploads a file to the specified Google Cloud Storage bucket."""
try:
client = storage.Client()
bucket = client.get_bucket(bucket_name)
blob = bucket.blob(blob_name)
blob.upload_from_filename(path_to_file)
print("File uploaded successfully to:", blob.public_url)
except Exception as e:
print(f"An error occurred: {e}")
bucket_name = 'hale-ripsaw-421615'
upload_to_bucket('results2c.pkl', '/tmp/all_results.pkl', 'hale-ripsaw-421615-storage')
Overwriting spark_job_2c.py
#2c)creating a run cluster again
#cluster with 4 machines and double the resources
!gcloud dataproc clusters create task-2c-cluster \
--project=hale-ripsaw-421615 \
--region=us-east1 \
--image-version="1.4-ubuntu18" \
--master-machine-type=n1-standard-2 \
--master-boot-disk-type=pd-ssd \
--master-boot-disk-size=100 \
--num-workers=3 \
--worker-machine-type=n1-standard-2 \
--worker-boot-disk-type=pd-standard \
--worker-boot-disk-size=100 \
--initialization-actions=gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh \
--metadata 'PIP_PACKAGES=tensorflow==2.4.0 google-cloud-storage' \
--scopes=default
Waiting on operation [projects/hale-ripsaw-421615/regions/us-east1/operations/85dd9019-adf8-3a16-8e0b-f09643944ae1]. WARNING: Don't create production clusters that reference initialization actions located in the gs://goog-dataproc-initialization-actions-REGION public buckets. These scripts are provided as reference implementations, and they are synchronized with ongoing GitHub repository changes—a new version of a initialization action in public buckets may break your cluster creation. Instead, copy the following initialization actions from public buckets into your bucket : gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh WARNING: Failed to validate permissions required for default service account: '126595473529-compute@developer.gserviceaccount.com'. Cluster creation could still be successful if required permissions have been granted to the respective service accounts as mentioned in the document https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts#dataproc_service_accounts_2. This could be due to Cloud Resource Manager API hasn't been enabled in your project '126595473529' before or it is disabled. Enable it by visiting 'https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=126595473529'. WARNING: For PD-Standard without local SSDs, we strongly recommend provisioning 1TB or larger to ensure consistently high I/O performance. See https://cloud.google.com/compute/docs/disks/performance for information on disk I/O performance. WARNING: The firewall rules for specified network or subnetwork would allow ingress traffic from 0.0.0.0/0, which could be a security risk. WARNING: The specified custom staging bucket 'dataproc-staging-us-east1-126595473529-r5gtifot' is not using uniform bucket level access IAM configuration. It is recommended to update bucket to enable the same. See https://cloud.google.com/storage/docs/uniform-bucket-level-access. Created [https://dataproc.googleapis.com/v1/projects/hale-ripsaw-421615/regions/us-east1/clusters/task-2c-cluster] Cluster placed in zone [us-east1-d].
#submitting the cluster
%%time
!gcloud dataproc jobs submit pyspark --cluster=task-2c-cluster --region=us-east1 --project=hale-ripsaw-421615 ./spark_job_2c.py
Job [94618e6761f94bd7a4eb22167b7a577d] submitted.
Waiting for job output...
2024-05-01 21:48:56.219869: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: :/usr/lib/hadoop/lib/native
2024-05-01 21:48:56.219910: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
24/05/01 21:48:59 INFO org.apache.spark.SparkEnv: Registering MapOutputTracker
24/05/01 21:48:59 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster
24/05/01 21:48:59 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator
24/05/01 21:48:59 INFO org.spark_project.jetty.util.log: Logging initialized @5438ms to org.spark_project.jetty.util.log.Slf4jLog
24/05/01 21:48:59 INFO org.spark_project.jetty.server.Server: jetty-9.4.z-SNAPSHOT; built: unknown; git: unknown; jvm 1.8.0_312-b07
24/05/01 21:48:59 INFO org.spark_project.jetty.server.Server: Started @5562ms
24/05/01 21:48:59 WARN org.apache.spark.util.Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
24/05/01 21:48:59 INFO org.spark_project.jetty.server.AbstractConnector: Started ServerConnector@598c346b{HTTP/1.1, (http/1.1)}{0.0.0.0:4041}
24/05/01 21:48:59 WARN org.apache.spark.scheduler.FairSchedulableBuilder: Fair Scheduler configuration file not found so jobs will be scheduled in FIFO order. To use fair scheduling, configure pools in fairscheduler.xml or set spark.scheduler.allocation.file to a file that contains the configuration.
24/05/01 21:49:00 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at task-2c-cluster-m/10.142.0.63:8032
24/05/01 21:49:01 INFO org.apache.hadoop.yarn.client.AHSProxy: Connecting to Application History server at task-2c-cluster-m/10.142.0.63:10200
24/05/01 21:49:01 WARN org.apache.hadoop.hdfs.DataStreamer: Caught exception
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.Thread.join(Thread.java:1252)
at java.lang.Thread.join(Thread.java:1326)
at org.apache.hadoop.hdfs.DataStreamer.closeResponder(DataStreamer.java:980)
at org.apache.hadoop.hdfs.DataStreamer.endBlock(DataStreamer.java:630)
at org.apache.hadoop.hdfs.DataStreamer.run(DataStreamer.java:807)
24/05/01 21:49:03 INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl: Submitted application application_1714596813125_0004
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 16.01
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 14.25
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 20.21
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 17.14
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 17.68
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 11.25
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 15.16
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 14.29
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 12.10
Result Type: TFRecord, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 14.22
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 37.20
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 23.82
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 21.78
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 30.65
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 28.90
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 27.95
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 32.66
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 33.74
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 37.24
Result Type: TFRecord, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 35.92
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 34.73
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 52.75
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 37.68
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 46.66
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 33.63
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 54.72
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 59.75
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 48.28
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 55.32
Result Type: TFRecord, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 55.53
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 36.56
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 23.05
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 62.92
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 58.74
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 53.13
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 64.41
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 50.52
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 68.42
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 50.50
Result Type: TFRecord, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 49.69
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 30.56
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 29.22
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 29.56
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 34.70
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 36.03
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 39.20
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 31.42
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 40.67
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 12.61
Result Type: TFRecord, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 32.53
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 67.07
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 72.29
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 70.94
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 40.98
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 69.30
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 84.12
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 60.59
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 61.54
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 62.67
Result Type: TFRecord, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 60.60
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 67.11
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 83.12
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 79.74
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 105.58
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 101.00
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 28.50
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 103.53
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 98.95
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 77.44
Result Type: TFRecord, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 75.93
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 102.23
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 122.25
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 116.07
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 152.68
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 136.40
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 81.46
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 127.96
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 155.39
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 124.06
Result Type: TFRecord, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 130.16
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 52.40
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 51.92
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 54.78
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 52.31
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 50.53
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 47.87
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 39.81
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 54.40
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 47.61
Result Type: TFRecord, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 39.67
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 98.97
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 93.03
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 106.26
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 98.58
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 92.20
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 100.74
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 92.17
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 87.36
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 101.65
Result Type: TFRecord, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 99.22
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 116.89
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 153.25
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 142.09
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 155.49
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 136.13
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 138.97
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 173.80
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 153.54
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 119.49
Result Type: TFRecord, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 144.61
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 170.09
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 122.47
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 204.76
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 143.33
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 140.83
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 184.55
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 205.71
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 166.02
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 158.11
Result Type: TFRecord, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 169.91
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 53.84
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 76.38
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 41.41
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 69.69
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 51.00
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 71.04
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 72.73
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 65.98
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 73.29
Result Type: TFRecord, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 63.08
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 151.03
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 142.90
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 125.46
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 119.23
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 130.14
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 111.76
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 132.14
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 123.88
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 106.67
Result Type: TFRecord, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 108.35
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 155.43
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 199.07
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 140.89
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 168.22
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 185.30
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 145.51
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 173.19
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 198.33
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 168.55
Result Type: TFRecord, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 175.09
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 215.82
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 251.42
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 201.05
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 250.24
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 279.17
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 178.14
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 220.21
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 216.94
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 189.30
Result Type: TFRecord, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 193.74
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 1, Images/Sec: 8.04
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 8.75
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 2, Images/Sec: 6.80
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 7.73
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 7.49
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 3, Images/Sec: 6.86
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 6.69
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 6.95
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 6.91
Result Type: Image, Batch Size: 2, Batch Number: 3, Repetition: 4, Images/Sec: 6.97
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 1, Images/Sec: 8.74
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 9.21
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 2, Images/Sec: 8.27
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 8.89
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 7.84
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 3, Images/Sec: 8.72
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 8.37
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 8.83
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 8.70
Result Type: Image, Batch Size: 2, Batch Number: 6, Repetition: 4, Images/Sec: 9.19
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 1, Images/Sec: 8.77
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 8.75
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 2, Images/Sec: 8.14
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 8.80
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 8.49
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 3, Images/Sec: 9.05
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 8.59
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 8.80
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 8.39
Result Type: Image, Batch Size: 2, Batch Number: 9, Repetition: 4, Images/Sec: 8.63
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 1, Images/Sec: 8.83
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 9.10
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 2, Images/Sec: 8.62
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 9.30
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 9.22
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 3, Images/Sec: 9.06
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 9.12
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 8.78
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 8.69
Result Type: Image, Batch Size: 2, Batch Number: 12, Repetition: 4, Images/Sec: 9.76
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 1, Images/Sec: 8.11
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 8.91
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 2, Images/Sec: 7.41
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 8.35
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 8.43
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 3, Images/Sec: 8.70
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 8.16
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 8.43
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 7.68
Result Type: Image, Batch Size: 4, Batch Number: 3, Repetition: 4, Images/Sec: 8.09
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 1, Images/Sec: 8.78
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 9.04
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 2, Images/Sec: 8.30
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 9.23
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 9.38
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 3, Images/Sec: 9.24
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 8.62
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 9.23
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 8.66
Result Type: Image, Batch Size: 4, Batch Number: 6, Repetition: 4, Images/Sec: 9.25
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 1, Images/Sec: 9.44
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 9.43
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 2, Images/Sec: 8.86
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 9.33
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 8.85
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 3, Images/Sec: 9.89
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 10.05
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 9.39
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 9.79
Result Type: Image, Batch Size: 4, Batch Number: 9, Repetition: 4, Images/Sec: 9.61
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 1, Images/Sec: 9.71
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 9.51
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 2, Images/Sec: 9.37
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 9.89
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 9.41
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 3, Images/Sec: 9.16
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 9.12
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 9.36
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 9.59
Result Type: Image, Batch Size: 4, Batch Number: 12, Repetition: 4, Images/Sec: 9.14
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 1, Images/Sec: 9.02
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 9.72
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 2, Images/Sec: 8.86
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 9.62
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 8.88
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 3, Images/Sec: 9.15
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 8.32
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 8.90
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 8.84
Result Type: Image, Batch Size: 6, Batch Number: 3, Repetition: 4, Images/Sec: 8.67
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 1, Images/Sec: 9.33
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 9.19
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 2, Images/Sec: 10.08
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 9.38
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 9.37
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 3, Images/Sec: 9.14
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 9.64
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 9.34
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 9.40
Result Type: Image, Batch Size: 6, Batch Number: 6, Repetition: 4, Images/Sec: 8.97
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 1, Images/Sec: 8.97
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 9.39
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 2, Images/Sec: 9.57
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 9.56
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 9.37
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 3, Images/Sec: 8.92
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 9.21
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 9.68
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 9.51
Result Type: Image, Batch Size: 6, Batch Number: 9, Repetition: 4, Images/Sec: 9.39
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 1, Images/Sec: 9.37
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 9.54
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 2, Images/Sec: 4.59
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 8.69
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 9.38
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 3, Images/Sec: 9.32
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 6.38
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 9.62
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 9.71
Result Type: Image, Batch Size: 6, Batch Number: 12, Repetition: 4, Images/Sec: 9.48
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 1, Images/Sec: 8.57
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 9.73
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 2, Images/Sec: 8.90
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 9.10
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 8.80
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 3, Images/Sec: 9.12
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 9.38
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 9.04
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 9.10
Result Type: Image, Batch Size: 8, Batch Number: 3, Repetition: 4, Images/Sec: 9.18
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 1, Images/Sec: 9.49
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 9.46
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 2, Images/Sec: 9.64
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 9.38
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 9.07
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 3, Images/Sec: 8.62
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 9.75
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 9.71
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 8.99
Result Type: Image, Batch Size: 8, Batch Number: 6, Repetition: 4, Images/Sec: 9.19
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 1, Images/Sec: 9.76
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 9.54
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 2, Images/Sec: 9.41
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 9.51
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 9.26
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 3, Images/Sec: 9.37
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 9.43
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 9.37
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 9.22
Result Type: Image, Batch Size: 8, Batch Number: 9, Repetition: 4, Images/Sec: 9.19
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 1, Images/Sec: 9.46
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 9.43
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 2, Images/Sec: 9.47
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 9.40
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 9.23
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 3, Images/Sec: 9.45
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 9.37
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 9.60
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 9.54
Result Type: Image, Batch Size: 8, Batch Number: 12, Repetition: 4, Images/Sec: 9.26
Parameter Combination: ((6, 3, 2), 46.8914999944101), Results: ['TFRecord']
Parameter Combination: ((6, 3, 3), 31.98426067494557), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 52.627688807284194), Results: ['TFRecord']
Parameter Combination: ((6, 6, 2), 81.62524218101301), Results: ['TFRecord']
Parameter Combination: ((6, 6, 3), 88.4779893377523), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 79.41814739134207), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 91.86591021783902), Results: ['TFRecord']
Parameter Combination: ((6, 9, 2), 152.9828025361548), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 98.97396438740712), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 118.33768698241856), Results: ['TFRecord']
Parameter Combination: ((6, 12, 2), 187.74674478519063), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 165.88202646511144), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 137.68362253181306), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 193.63427672290584), Results: ['TFRecord']
Parameter Combination: ((8, 3, 1), 63.476765779917), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 58.0738504886732), Results: ['TFRecord']
Parameter Combination: ((8, 6, 1), 124.85416503875364), Results: ['TFRecord']
Parameter Combination: ((8, 6, 2), 143.302943550511), Results: ['TFRecord']
Parameter Combination: ((8, 6, 2), 107.26948738031682), Results: ['TFRecord']
Parameter Combination: ((8, 6, 3), 106.5485025376681), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 145.17620895690285), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 121.66968957477437), Results: ['TFRecord']
Parameter Combination: ((8, 12, 3), 212.5282101059492), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 263.9024908816233), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 219.47976321555888), Results: ['TFRecord']
Parameter Combination: ((6, 3, 2), 6.545862585865302), Results: ['Image']
Parameter Combination: ((6, 3, 3), 7.412592010038262), Results: ['Image']
Parameter Combination: ((6, 3, 3), 7.450943957649588), Results: ['Image']
Parameter Combination: ((6, 3, 3), 7.60272144246682), Results: ['Image']
Parameter Combination: ((6, 6, 3), 8.789326071283007), Results: ['Image']
Parameter Combination: ((6, 9, 3), 9.127579544381108), Results: ['Image']
Parameter Combination: ((6, 9, 3), 9.531770940297553), Results: ['Image']
Parameter Combination: ((6, 9, 3), 9.298797360432593), Results: ['Image']
Parameter Combination: ((6, 12, 4), 9.25297887722372), Results: ['Image']
Parameter Combination: ((6, 12, 4), 9.16825835389885), Results: ['Image']
Parameter Combination: ((6, 12, 4), 9.365965491092156), Results: ['Image']
Parameter Combination: ((6, 12, 4), 9.261862159125224), Results: ['Image']
Parameter Combination: ((8, 3, 3), 9.254740669805784), Results: ['Image']
Parameter Combination: ((8, 3, 3), 9.093307505066376), Results: ['Image']
Parameter Combination: ((8, 6, 1), 8.737988837944998), Results: ['Image']
Parameter Combination: ((8, 6, 4), 9.10950376277334), Results: ['Image']
Parameter Combination: ((8, 6, 4), 9.412351422655206), Results: ['Image']
Parameter Combination: ((8, 6, 4), 9.109187630678424), Results: ['Image']
Parameter Combination: ((8, 9, 1), 9.393093406617675), Results: ['Image']
Parameter Combination: ((8, 12, 2), 9.16940812684376), Results: ['Image']
Parameter Combination: ((8, 12, 2), 9.338650295650076), Results: ['Image']
Parameter Combination: ((8, 12, 3), 8.520762000863519), Results: ['Image']
Parameter Combination: ((2, 3, 2), 6.564296041753451), Results: ['Image']
Parameter Combination: ((2, 3, 3), 7.701012803796003), Results: ['Image']
Parameter Combination: ((2, 3, 3), 7.4975715992408825), Results: ['Image']
Parameter Combination: ((2, 3, 4), 8.112914925018037), Results: ['Image']
Parameter Combination: ((2, 6, 2), 9.245648827477764), Results: ['Image']
Parameter Combination: ((2, 9, 2), 8.717594519209142), Results: ['Image']
Parameter Combination: ((2, 9, 2), 8.787438593534416), Results: ['Image']
Parameter Combination: ((2, 9, 3), 9.089514610890735), Results: ['Image']
Parameter Combination: ((2, 9, 3), 9.1899490969325), Results: ['Image']
Parameter Combination: ((2, 12, 4), 9.22263552414298), Results: ['Image']
Parameter Combination: ((2, 12, 4), 9.156409567907298), Results: ['Image']
Parameter Combination: ((2, 12, 4), 9.22729448102843), Results: ['Image']
Parameter Combination: ((2, 12, 4), 9.310994707447229), Results: ['Image']
Parameter Combination: ((4, 3, 2), 8.871851856030053), Results: ['Image']
Parameter Combination: ((4, 3, 2), 8.380590568356272), Results: ['Image']
Parameter Combination: ((4, 3, 3), 9.652314792086013), Results: ['Image']
Parameter Combination: ((4, 6, 4), 9.227549079676994), Results: ['Image']
Parameter Combination: ((4, 6, 4), 9.108350625452474), Results: ['Image']
Parameter Combination: ((4, 6, 4), 9.238377013658878), Results: ['Image']
Parameter Combination: ((4, 9, 1), 9.545643993464745), Results: ['Image']
Parameter Combination: ((4, 12, 2), 9.429668554162333), Results: ['Image']
Parameter Combination: ((4, 12, 2), 9.466599238399128), Results: ['Image']
Parameter Combination: ((2, 3, 1), 13.522226717841502), Results: ['TFRecord']
Parameter Combination: ((2, 3, 3), 15.862909615577353), Results: ['TFRecord']
Parameter Combination: ((2, 6, 1), 22.83766144196075), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 39.11560135256435), Results: ['TFRecord']
Parameter Combination: ((2, 12, 2), 67.0620546858293), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 57.913044678917025), Results: ['TFRecord']
Parameter Combination: ((4, 3, 1), 35.3476662385008), Results: ['TFRecord']
Parameter Combination: ((4, 3, 3), 33.7898571983869), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 38.86601740226285), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 34.155523675999355), Results: ['TFRecord']
Parameter Combination: ((4, 6, 3), 70.00584591568278), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 65.3661586333946), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 69.2264075036603), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 69.61678549174495), Results: ['TFRecord']
Parameter Combination: ((4, 9, 2), 94.45129715373058), Results: ['TFRecord']
Parameter Combination: ((4, 9, 3), 83.1331705850679), Results: ['TFRecord']
Parameter Combination: ((4, 12, 1), 138.58032914848025), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 115.7250235385682), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 115.43274221763279), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 123.29509750845743), Results: ['TFRecord']
Parameter Combination: ((2, 3, 2), 9.185519146426214), Results: ['Image']
Parameter Combination: ((2, 3, 3), 8.277621648931131), Results: ['Image']
Parameter Combination: ((2, 3, 4), 7.410948290560913), Results: ['Image']
Parameter Combination: ((2, 3, 4), 7.657332724783204), Results: ['Image']
Parameter Combination: ((2, 6, 3), 7.814548651231019), Results: ['Image']
Parameter Combination: ((2, 6, 4), 8.720380697212585), Results: ['Image']
Parameter Combination: ((2, 6, 4), 8.876575549388775), Results: ['Image']
Parameter Combination: ((2, 6, 4), 8.120121592943711), Results: ['Image']
Parameter Combination: ((2, 6, 4), 8.554546236377846), Results: ['Image']
Parameter Combination: ((2, 9, 1), 8.762421670902366), Results: ['Image']
Parameter Combination: ((2, 9, 4), 9.046319666183221), Results: ['Image']
Parameter Combination: ((2, 12, 2), 8.999866159760543), Results: ['Image']
Parameter Combination: ((2, 12, 3), 9.36112689175103), Results: ['Image']
Parameter Combination: ((2, 12, 3), 9.434503716459801), Results: ['Image']
Parameter Combination: ((4, 3, 1), 8.336365387510702), Results: ['Image']
Parameter Combination: ((4, 3, 4), 9.480684937751255), Results: ['Image']
Parameter Combination: ((4, 6, 3), 9.347322348190378), Results: ['Image']
Parameter Combination: ((4, 6, 3), 9.480832270392847), Results: ['Image']
Parameter Combination: ((4, 6, 3), 9.776238303205163), Results: ['Image']
Parameter Combination: ((4, 9, 2), 9.316602130068686), Results: ['Image']
Parameter Combination: ((4, 9, 2), 9.037513520812356), Results: ['Image']
Parameter Combination: ((4, 12, 1), 9.783875474568273), Results: ['Image']
Parameter Combination: ((2, 3, 3), 16.18114574063691), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 19.738861026967587), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 15.241927160933491), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 15.63913527393536), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 32.22605262669264), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 36.63822232186858), Results: ['TFRecord']
Parameter Combination: ((2, 9, 1), 44.338839951395954), Results: ['TFRecord']
Parameter Combination: ((2, 9, 2), 55.59403069482347), Results: ['TFRecord']
Parameter Combination: ((2, 9, 3), 42.9691920496934), Results: ['TFRecord']
Parameter Combination: ((2, 9, 3), 46.369070855541075), Results: ['TFRecord']
Parameter Combination: ((2, 9, 3), 46.13127261195457), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 49.805896951777044), Results: ['TFRecord']
Parameter Combination: ((2, 12, 2), 64.78685975513609), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 66.20590374742348), Results: ['TFRecord']
Parameter Combination: ((4, 3, 3), 30.62061010465299), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 21.041078298006827), Results: ['TFRecord']
Parameter Combination: ((4, 6, 4), 74.9646048475921), Results: ['TFRecord']
Parameter Combination: ((4, 9, 1), 82.21322359587636), Results: ['TFRecord']
Parameter Combination: ((4, 9, 2), 85.63838406868541), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 103.53593502936816), Results: ['TFRecord']
Parameter Combination: ((4, 12, 2), 126.01010200901044), Results: ['TFRecord']
Parameter Combination: ((4, 12, 3), 107.48195096950542), Results: ['TFRecord']
Parameter Combination: ((6, 3, 1), 42.07869704385862), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 47.3174922017535), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 39.466020970488884), Results: ['TFRecord']
Parameter Combination: ((6, 6, 3), 71.7483004349233), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 60.58496704227929), Results: ['TFRecord']
Parameter Combination: ((6, 9, 3), 150.6599766519106), Results: ['TFRecord']
Parameter Combination: ((6, 9, 3), 130.0695312401296), Results: ['TFRecord']
Parameter Combination: ((6, 12, 3), 153.7679960405961), Results: ['TFRecord']
Parameter Combination: ((8, 3, 2), 55.23460274748308), Results: ['TFRecord']
Parameter Combination: ((8, 3, 2), 59.06988573115221), Results: ['TFRecord']
Parameter Combination: ((8, 3, 3), 50.51942871653938), Results: ['TFRecord']
Parameter Combination: ((8, 3, 3), 62.481485205668214), Results: ['TFRecord']
Parameter Combination: ((8, 6, 3), 109.21789700045787), Results: ['TFRecord']
Parameter Combination: ((8, 6, 3), 129.8327564825581), Results: ['TFRecord']
Parameter Combination: ((8, 9, 1), 150.3897755432141), Results: ['TFRecord']
Parameter Combination: ((8, 9, 3), 144.68432034181137), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 179.43429246748832), Results: ['TFRecord']
Parameter Combination: ((8, 12, 1), 233.26338132772247), Results: ['TFRecord']
Parameter Combination: ((8, 12, 3), 135.4843713881074), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 232.6552499991333), Results: ['TFRecord']
Parameter Combination: ((8, 12, 4), 248.8619647485936), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 7.431658883506962), Results: ['Image']
Parameter Combination: ((6, 3, 4), 7.265836806535661), Results: ['Image']
Parameter Combination: ((6, 3, 4), 7.325363976049624), Results: ['Image']
Parameter Combination: ((6, 3, 4), 7.5215728922601715), Results: ['Image']
Parameter Combination: ((6, 9, 4), 9.573126383447615), Results: ['Image']
Parameter Combination: ((6, 9, 4), 9.240725407770352), Results: ['Image']
Parameter Combination: ((6, 9, 4), 9.601459368951462), Results: ['Image']
Parameter Combination: ((6, 9, 4), 9.609581901305653), Results: ['Image']
Parameter Combination: ((6, 12, 3), 9.353537071755492), Results: ['Image']
Parameter Combination: ((6, 12, 3), 9.453483578217018), Results: ['Image']
Parameter Combination: ((6, 12, 3), 9.38605522405233), Results: ['Image']
Parameter Combination: ((8, 3, 4), 9.00310277582704), Results: ['Image']
Parameter Combination: ((8, 3, 4), 9.139452068475553), Results: ['Image']
Parameter Combination: ((8, 6, 3), 9.269782731731915), Results: ['Image']
Parameter Combination: ((8, 6, 3), 9.315597692257933), Results: ['Image']
Parameter Combination: ((8, 9, 2), 9.18845119057562), Results: ['Image']
Parameter Combination: ((8, 9, 2), 9.436423778109376), Results: ['Image']
Parameter Combination: ((8, 12, 1), 9.597169795198516), Results: ['Image']
Parameter Combination: ((8, 12, 4), 8.346775526083679), Results: ['Image']
Parameter Combination: ((6, 3, 1), 7.112545433494013), Results: ['Image']
Parameter Combination: ((6, 6, 4), 9.34662744748242), Results: ['Image']
Parameter Combination: ((6, 6, 4), 9.33507115726239), Results: ['Image']
Parameter Combination: ((6, 6, 4), 9.333824148202847), Results: ['Image']
Parameter Combination: ((6, 6, 4), 9.136901447109759), Results: ['Image']
Parameter Combination: ((6, 9, 1), 9.641095992221823), Results: ['Image']
Parameter Combination: ((6, 12, 2), 9.37145408533516), Results: ['Image']
Parameter Combination: ((6, 12, 2), 9.617591992799941), Results: ['Image']
Parameter Combination: ((8, 3, 1), 9.69551586960276), Results: ['Image']
Parameter Combination: ((8, 3, 4), 8.72925480221202), Results: ['Image']
Parameter Combination: ((8, 3, 4), 8.84913700004035), Results: ['Image']
Parameter Combination: ((8, 6, 2), 9.90595223334219), Results: ['Image']
Parameter Combination: ((8, 6, 2), 9.640183366257897), Results: ['Image']
Parameter Combination: ((8, 6, 3), 8.809518729503509), Results: ['Image']
Parameter Combination: ((8, 9, 3), 9.624906062392705), Results: ['Image']
Parameter Combination: ((8, 9, 3), 9.254801081156321), Results: ['Image']
Parameter Combination: ((8, 9, 3), 9.344547702403569), Results: ['Image']
Parameter Combination: ((8, 12, 4), 9.538140522881159), Results: ['Image']
Parameter Combination: ((8, 12, 4), 9.41986278574664), Results: ['Image']
Parameter Combination: ((8, 12, 4), 9.754493087725061), Results: ['Image']
Parameter Combination: ((2, 3, 1), 7.191381940320771), Results: ['Image']
Parameter Combination: ((2, 6, 1), 8.580097178820724), Results: ['Image']
Parameter Combination: ((2, 9, 4), 8.962045475534934), Results: ['Image']
Parameter Combination: ((2, 9, 4), 8.359049472282734), Results: ['Image']
Parameter Combination: ((2, 9, 4), 8.768175497599007), Results: ['Image']
Parameter Combination: ((2, 12, 2), 9.029949638105176), Results: ['Image']
Parameter Combination: ((2, 12, 3), 8.91472221799103), Results: ['Image']
Parameter Combination: ((4, 3, 4), 8.462573715128125), Results: ['Image']
Parameter Combination: ((4, 3, 4), 8.841786393440463), Results: ['Image']
Parameter Combination: ((4, 3, 4), 8.929979049922501), Results: ['Image']
Parameter Combination: ((4, 6, 2), 9.260168073998702), Results: ['Image']
Parameter Combination: ((4, 6, 2), 9.086215851307944), Results: ['Image']
Parameter Combination: ((4, 9, 3), 9.049983292931696), Results: ['Image']
Parameter Combination: ((4, 9, 3), 9.444107711465968), Results: ['Image']
Parameter Combination: ((4, 9, 3), 9.292213276851195), Results: ['Image']
Parameter Combination: ((4, 12, 3), 10.07855185984043), Results: ['Image']
Parameter Combination: ((4, 12, 4), 9.223321264579845), Results: ['Image']
Parameter Combination: ((4, 12, 4), 9.182086833189995), Results: ['Image']
Parameter Combination: ((4, 12, 4), 9.750204567432865), Results: ['Image']
Parameter Combination: ((6, 3, 3), 45.26189348530648), Results: ['TFRecord']
Parameter Combination: ((6, 3, 4), 50.29660802973928), Results: ['TFRecord']
Parameter Combination: ((6, 9, 1), 137.6558197541804), Results: ['TFRecord']
Parameter Combination: ((6, 12, 3), 176.35414031485524), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 68.53041320457353), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 99.53368817292547), Results: ['TFRecord']
Parameter Combination: ((8, 6, 4), 111.95539725570339), Results: ['TFRecord']
Parameter Combination: ((8, 9, 2), 180.7428708914034), Results: ['TFRecord']
Parameter Combination: ((8, 9, 3), 165.2904162283405), Results: ['TFRecord']
Parameter Combination: ((8, 9, 3), 177.4444603745026), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 138.59759685749256), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 170.52894995259476), Results: ['TFRecord']
Parameter Combination: ((8, 9, 4), 178.6672914314924), Results: ['TFRecord']
Parameter Combination: ((8, 12, 2), 223.3707125671868), Results: ['TFRecord']
Parameter Combination: ((8, 12, 3), 230.1041012095728), Results: ['TFRecord']
Parameter Combination: ((2, 3, 2), 8.991724954051342), Results: ['TFRecord']
Parameter Combination: ((2, 3, 2), 16.113913603052996), Results: ['TFRecord']
Parameter Combination: ((2, 3, 3), 17.28178656164482), Results: ['TFRecord']
Parameter Combination: ((2, 6, 2), 31.799763452382155), Results: ['TFRecord']
Parameter Combination: ((2, 6, 3), 30.30595670478521), Results: ['TFRecord']
Parameter Combination: ((2, 6, 3), 30.480365243710793), Results: ['TFRecord']
Parameter Combination: ((2, 6, 3), 34.57629996929247), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 44.76500077970791), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 48.708172150121676), Results: ['TFRecord']
Parameter Combination: ((2, 12, 3), 64.05999270709836), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 59.258775056557724), Results: ['TFRecord']
Parameter Combination: ((4, 3, 3), 39.99628737261683), Results: ['TFRecord']
Parameter Combination: ((4, 3, 4), 36.86033736393869), Results: ['TFRecord']
Parameter Combination: ((4, 6, 2), 61.91528598131531), Results: ['TFRecord']
Parameter Combination: ((4, 9, 3), 89.23265268011268), Results: ['TFRecord']
Parameter Combination: ((4, 9, 3), 97.1062925055227), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 106.739400811388), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 66.67305925225648), Results: ['TFRecord']
Parameter Combination: ((4, 12, 4), 141.2584245696853), Results: ['TFRecord']
Parameter Combination: ((2, 3, 4), 17.300308116201467), Results: ['TFRecord']
Parameter Combination: ((2, 6, 2), 28.168943203912292), Results: ['TFRecord']
Parameter Combination: ((2, 6, 4), 30.98497219569943), Results: ['TFRecord']
Parameter Combination: ((2, 9, 2), 53.28032316480191), Results: ['TFRecord']
Parameter Combination: ((2, 9, 4), 39.89852856698183), Results: ['TFRecord']
Parameter Combination: ((2, 12, 1), 53.765603318339), Results: ['TFRecord']
Parameter Combination: ((2, 12, 3), 71.96949153996513), Results: ['TFRecord']
Parameter Combination: ((2, 12, 3), 63.58317684400019), Results: ['TFRecord']
Parameter Combination: ((2, 12, 4), 56.63813434490178), Results: ['TFRecord']
Parameter Combination: ((4, 3, 2), 29.988285111152024), Results: ['TFRecord']
Parameter Combination: ((4, 3, 2), 33.86572575110415), Results: ['TFRecord']
Parameter Combination: ((4, 6, 1), 53.82594779171655), Results: ['TFRecord']
Parameter Combination: ((4, 6, 2), 50.095348242340876), Results: ['TFRecord']
Parameter Combination: ((4, 6, 3), 55.51178580409492), Results: ['TFRecord']
Parameter Combination: ((4, 6, 3), 51.087798505682606), Results: ['TFRecord']
Parameter Combination: ((4, 9, 4), 89.4838411069344), Results: ['TFRecord']
Parameter Combination: ((4, 12, 2), 136.9230536949039), Results: ['TFRecord']
Parameter Combination: ((4, 12, 3), 117.1758995248979), Results: ['TFRecord']
Parameter Combination: ((4, 12, 3), 141.75493225107797), Results: ['TFRecord']
Parameter Combination: ((6, 3, 2), 7.106913300191103), Results: ['Image']
Parameter Combination: ((6, 6, 1), 7.383349393063468), Results: ['Image']
Parameter Combination: ((6, 6, 2), 8.719304580415614), Results: ['Image']
Parameter Combination: ((6, 6, 2), 8.751471223735434), Results: ['Image']
Parameter Combination: ((6, 6, 3), 9.263715712444391), Results: ['Image']
Parameter Combination: ((6, 6, 3), 9.117896354790556), Results: ['Image']
Parameter Combination: ((6, 9, 2), 9.27716526866915), Results: ['Image']
Parameter Combination: ((6, 9, 2), 9.410911088967376), Results: ['Image']
Parameter Combination: ((6, 12, 1), 9.12100796432612), Results: ['Image']
Parameter Combination: ((8, 3, 2), 9.262622071721044), Results: ['Image']
Parameter Combination: ((8, 3, 2), 9.316746993906458), Results: ['Image']
Parameter Combination: ((8, 3, 3), 8.62284248614467), Results: ['Image']
Parameter Combination: ((8, 6, 4), 8.760942965482963), Results: ['Image']
Parameter Combination: ((8, 9, 4), 9.116119402462436), Results: ['Image']
Parameter Combination: ((8, 9, 4), 9.119029055407264), Results: ['Image']
Parameter Combination: ((8, 9, 4), 9.527070120258996), Results: ['Image']
Parameter Combination: ((8, 9, 4), 9.115945487718509), Results: ['Image']
Parameter Combination: ((8, 12, 3), 9.500825278125523), Results: ['Image']
Parameter Combination: ((8, 12, 3), 9.538154305341703), Results: ['Image']
Parameter Combination: ((2, 3, 4), 9.081522080385348), Results: ['Image']
Parameter Combination: ((2, 6, 2), 8.449324848360318), Results: ['Image']
Parameter Combination: ((2, 6, 3), 9.039592766479206), Results: ['Image']
Parameter Combination: ((2, 6, 3), 9.092865595117871), Results: ['Image']
Parameter Combination: ((2, 9, 3), 8.69813499980587), Results: ['Image']
Parameter Combination: ((2, 12, 1), 9.68292638350405), Results: ['Image']
Parameter Combination: ((4, 3, 3), 8.767370077160086), Results: ['Image']
Parameter Combination: ((4, 3, 3), 8.943406244080718), Results: ['Image']
Parameter Combination: ((4, 6, 1), 9.069857873871834), Results: ['Image']
Parameter Combination: ((4, 6, 4), 8.866809051248143), Results: ['Image']
Parameter Combination: ((4, 9, 4), 9.405208056085819), Results: ['Image']
Parameter Combination: ((4, 9, 4), 9.626070362427948), Results: ['Image']
Parameter Combination: ((4, 9, 4), 9.860050764636625), Results: ['Image']
Parameter Combination: ((4, 9, 4), 9.2419619934539), Results: ['Image']
Parameter Combination: ((4, 12, 3), 9.731773136071421), Results: ['Image']
Parameter Combination: ((4, 12, 3), 9.514940690002494), Results: ['Image']
Parameter Combination: ((4, 12, 4), 10.184297886928555), Results: ['Image']
Parameter Combination: ((6, 3, 2), 43.35481736961248), Results: ['TFRecord']
Parameter Combination: ((6, 3, 3), 50.42961593388757), Results: ['TFRecord']
Parameter Combination: ((6, 6, 1), 91.16323595646719), Results: ['TFRecord']
Parameter Combination: ((6, 6, 2), 80.13330382630764), Results: ['TFRecord']
Parameter Combination: ((6, 6, 3), 97.85194440268137), Results: ['TFRecord']
Parameter Combination: ((6, 6, 4), 94.75910863209077), Results: ['TFRecord']
Parameter Combination: ((6, 9, 2), 125.07975330022796), Results: ['TFRecord']
Parameter Combination: ((6, 9, 3), 112.58785054394428), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 151.60165381858195), Results: ['TFRecord']
Parameter Combination: ((6, 9, 4), 139.65935295782515), Results: ['TFRecord']
Parameter Combination: ((6, 12, 1), 153.01962314362487), Results: ['TFRecord']
Parameter Combination: ((6, 12, 2), 158.59264168521352), Results: ['TFRecord']
Parameter Combination: ((6, 12, 3), 139.0159404144839), Results: ['TFRecord']
Parameter Combination: ((6, 12, 4), 172.77989735843875), Results: ['TFRecord']
Parameter Combination: ((8, 3, 3), 48.045797132715364), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 59.224468447500165), Results: ['TFRecord']
Parameter Combination: ((8, 3, 4), 67.25458226156672), Results: ['TFRecord']
Parameter Combination: ((8, 9, 2), 183.31080598754417), Results: ['TFRecord']
Parameter Combination: ((8, 12, 2), 228.42188135544183), Results: ['TFRecord']
24/05/01 22:10:06 INFO org.spark_project.jetty.server.AbstractConnector: Stopped Spark@598c346b{HTTP/1.1, (http/1.1)}{0.0.0.0:4041}
24/05/01 22:10:07 INFO org.apache.spark.SparkEnv: Registering MapOutputTracker
24/05/01 22:10:07 INFO org.apache.spark.SparkEnv: Registering BlockManagerMaster
24/05/01 22:10:07 INFO org.apache.spark.SparkEnv: Registering OutputCommitCoordinator
24/05/01 22:10:07 INFO org.spark_project.jetty.server.Server: jetty-9.4.z-SNAPSHOT; built: unknown; git: unknown; jvm 1.8.0_312-b07
24/05/01 22:10:07 INFO org.spark_project.jetty.server.Server: Started @1273812ms
24/05/01 22:10:07 INFO org.spark_project.jetty.server.AbstractConnector: Started ServerConnector@7107d357{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
24/05/01 22:10:07 WARN org.apache.spark.scheduler.FairSchedulableBuilder: Fair Scheduler configuration file not found so jobs will be scheduled in FIFO order. To use fair scheduling, configure pools in fairscheduler.xml or set spark.scheduler.allocation.file to a file that contains the configuration.
24/05/01 22:10:07 INFO org.apache.hadoop.yarn.client.RMProxy: Connecting to ResourceManager at task-2c-cluster-m/10.142.0.63:8032
24/05/01 22:10:07 INFO org.apache.hadoop.yarn.client.AHSProxy: Connecting to Application History server at task-2c-cluster-m/10.142.0.63:10200
24/05/01 22:10:08 INFO org.apache.hadoop.yarn.client.api.impl.YarnClientImpl: Submitted application application_1714596813125_0006
24/05/01 22:10:13 WARN org.apache.spark.scheduler.cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Attempted to request executors before the AM has registered!
Parameter Combination: (2, 3, 2), Average Images per Second: 3.0
Parameter Combination: (2, 3, 4), Average Images per Second: 1.5
Parameter Combination: (2, 6, 1), Average Images per Second: 12.0
Parameter Combination: (2, 6, 3), Average Images per Second: 4.0
Parameter Combination: (2, 9, 2), Average Images per Second: 9.0
Parameter Combination: (2, 9, 4), Average Images per Second: 4.5
Parameter Combination: (2, 12, 1), Average Images per Second: 24.0
Parameter Combination: (2, 12, 3), Average Images per Second: 8.0
Parameter Combination: (4, 3, 2), Average Images per Second: 6.0
Parameter Combination: (4, 3, 4), Average Images per Second: 3.0
Parameter Combination: (4, 6, 1), Average Images per Second: 24.0
Parameter Combination: (4, 6, 3), Average Images per Second: 8.0
Parameter Combination: (4, 9, 2), Average Images per Second: 18.0
Parameter Combination: (4, 9, 4), Average Images per Second: 9.0
Parameter Combination: (4, 12, 1), Average Images per Second: 48.0
Parameter Combination: (4, 12, 3), Average Images per Second: 16.0
Parameter Combination: (6, 3, 2), Average Images per Second: 9.0
Parameter Combination: (6, 3, 4), Average Images per Second: 4.5
Parameter Combination: (6, 6, 1), Average Images per Second: 36.0
Parameter Combination: (6, 6, 3), Average Images per Second: 12.0
Parameter Combination: (6, 9, 2), Average Images per Second: 27.0
Parameter Combination: (6, 9, 4), Average Images per Second: 13.5
Parameter Combination: (6, 12, 1), Average Images per Second: 72.0
Parameter Combination: (6, 12, 3), Average Images per Second: 24.0
Parameter Combination: (8, 3, 2), Average Images per Second: 12.0
Parameter Combination: (8, 3, 4), Average Images per Second: 6.0
Parameter Combination: (8, 6, 1), Average Images per Second: 48.0
Parameter Combination: (8, 6, 3), Average Images per Second: 16.0
Parameter Combination: (8, 9, 2), Average Images per Second: 36.0
Parameter Combination: (8, 9, 4), Average Images per Second: 18.0
Parameter Combination: (8, 12, 1), Average Images per Second: 96.0
Parameter Combination: (8, 12, 3), Average Images per Second: 32.0
Parameter Combination: (2, 3, 1), Average Images per Second: 6.0
Parameter Combination: (2, 3, 3), Average Images per Second: 2.0
Parameter Combination: (2, 6, 2), Average Images per Second: 6.0
Parameter Combination: (2, 6, 4), Average Images per Second: 3.0
Parameter Combination: (2, 9, 1), Average Images per Second: 18.0
Parameter Combination: (2, 9, 3), Average Images per Second: 6.0
Parameter Combination: (2, 12, 2), Average Images per Second: 12.0
Parameter Combination: (2, 12, 4), Average Images per Second: 6.0
Parameter Combination: (4, 3, 1), Average Images per Second: 12.0
Parameter Combination: (4, 3, 3), Average Images per Second: 4.0
Parameter Combination: (4, 6, 2), Average Images per Second: 12.0
Parameter Combination: (4, 6, 4), Average Images per Second: 6.0
Parameter Combination: (4, 9, 1), Average Images per Second: 36.0
Parameter Combination: (4, 9, 3), Average Images per Second: 12.0
Parameter Combination: (4, 12, 2), Average Images per Second: 24.0
Parameter Combination: (4, 12, 4), Average Images per Second: 12.0
Parameter Combination: (6, 3, 1), Average Images per Second: 18.0
Parameter Combination: (6, 3, 3), Average Images per Second: 6.0
Parameter Combination: (6, 6, 2), Average Images per Second: 18.0
Parameter Combination: (6, 6, 4), Average Images per Second: 9.0
Parameter Combination: (6, 9, 1), Average Images per Second: 54.0
Parameter Combination: (6, 9, 3), Average Images per Second: 18.0
Parameter Combination: (6, 12, 2), Average Images per Second: 36.0
Parameter Combination: (6, 12, 4), Average Images per Second: 18.0
Parameter Combination: (8, 3, 1), Average Images per Second: 24.0
Parameter Combination: (8, 3, 3), Average Images per Second: 8.0
Parameter Combination: (8, 6, 2), Average Images per Second: 24.0
Parameter Combination: (8, 6, 4), Average Images per Second: 12.0
Parameter Combination: (8, 9, 1), Average Images per Second: 72.0
Parameter Combination: (8, 9, 3), Average Images per Second: 24.0
Parameter Combination: (8, 12, 2), Average Images per Second: 48.0
Parameter Combination: (8, 12, 4), Average Images per Second: 24.0
24/05/01 22:10:19 INFO org.spark_project.jetty.server.AbstractConnector: Stopped Spark@7107d357{HTTP/1.1, (http/1.1)}{0.0.0.0:4040}
File uploaded successfully to: https://storage.googleapis.com/hale-ripsaw-421615-storage/results2c.pkl
Job [94618e6761f94bd7a4eb22167b7a577d] finished successfully.
done: true
driverControlFilesUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/ecb2b773-7396-4f3c-a6ff-ef6172409e26/jobs/94618e6761f94bd7a4eb22167b7a577d/
driverOutputResourceUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/ecb2b773-7396-4f3c-a6ff-ef6172409e26/jobs/94618e6761f94bd7a4eb22167b7a577d/driveroutput
jobUuid: 0744ab8d-e12c-3f8e-bf33-ce49f4ccea63
placement:
clusterName: task-2c-cluster
clusterUuid: ecb2b773-7396-4f3c-a6ff-ef6172409e26
pysparkJob:
mainPythonFileUri: gs://dataproc-staging-us-east1-126595473529-r5gtifot/google-cloud-dataproc-metainfo/ecb2b773-7396-4f3c-a6ff-ef6172409e26/jobs/94618e6761f94bd7a4eb22167b7a577d/staging/spark_job_2c.py
reference:
jobId: 94618e6761f94bd7a4eb22167b7a577d
projectId: hale-ripsaw-421615
status:
state: DONE
stateStartTime: '2024-05-01T22:10:21.991409Z'
statusHistory:
- state: PENDING
stateStartTime: '2024-05-01T21:48:52.295726Z'
- state: SETUP_DONE
stateStartTime: '2024-05-01T21:48:52.316699Z'
- details: Agent reported job success
state: RUNNING
stateStartTime: '2024-05-01T21:48:52.530919Z'
yarnApplications:
- name: spark_job_2c.py
progress: 1.0
state: FINISHED
trackingUrl: http://task-2c-cluster-m:8088/proxy/application_1714596813125_0004/
- name: AverageReadingSpeeds
progress: 1.0
state: FINISHED
trackingUrl: http://task-2c-cluster-m:8088/proxy/application_1714596813125_0006/
CPU times: user 9.61 s, sys: 1.12 s, total: 10.7 s
Wall time: 21min 33s
Run the tests over a wide range of different paramters and list the results in a table.
Perform a linear regression (e.g. using scikit-learn) over the values for each parameter and for the two cases (reading from image files/reading TFRecord files).
List a table with the output and interpret the results in terms of the effects of overall.
Also, plot the output values, the averages per parameter value and the regression lines for each parameter and for the product of batch_size and batch_number
Discuss the implications of this result for applications like large-scale machine learning. Keep in mind that cloud data may be stored in distant physical locations. Use the numbers provided in the PDF latency-numbers document available on Moodle or here for your arguments.
How is the observed behaviour similar or different from what you’d expect from a single machine? Why would cloud providers tie throughput to capacity of disk resources?
By parallelising the speed test we are making assumptions about the limits of the bucket reading speeds. See here for more information. Discuss, what we need to consider in speed tests in parallel on the cloud, which bottlenecks we might be identifying, and how this relates to your results.
Discuss to what extent linear modelling reflects the effects we are observing. Discuss what could be expected from a theoretical perspective and what can be useful in practice.
Write your code below and include the output in your submitted ipynb file. Provide the answer text in your report.
!gsutil cp gs://hale-ripsaw-421615-storage/results2c.pkl ./results2c.pkl
#we copy the file from the google cloud storage to the local file system
Copying gs://hale-ripsaw-421615-storage/results2c.pkl... / [1 files][ 24.1 KiB/ 24.1 KiB] Operation completed over 1 objects/24.1 KiB.
import pandas as pd
pickle_file_path = './results2c.pkl'
with open(pickle_file_path, 'rb') as file:
results_task2c = pickle.load(file)
print(results_task2c)
#we open the downloaded results pickle file
#we use pickle.load to deserialize the pickle file
#we print the output and deserialized data
{'2a iii results': [('TFRecord', (2, 3, 1), 16.005138775559526), ('TFRecord', (2, 3, 2), 14.250336781652804), ('TFRecord', (2, 3, 2), 20.207751203472103), ('TFRecord', (2, 3, 3), 17.1381803546292), ('TFRecord', (2, 3, 3), 17.675148915189453), ('TFRecord', (2, 3, 3), 11.249362005713675), ('TFRecord', (2, 3, 4), 15.160847316922121), ('TFRecord', (2, 3, 4), 14.290368045137118), ('TFRecord', (2, 3, 4), 12.095522904560726), ('TFRecord', (2, 3, 4), 14.224778623002859), ('TFRecord', (2, 6, 1), 37.19976053392067), ('TFRecord', (2, 6, 2), 23.82167412657116), ('TFRecord', (2, 6, 2), 21.77924881576778), ('TFRecord', (2, 6, 3), 30.65462691257779), ('TFRecord', (2, 6, 3), 28.895047758798263), ('TFRecord', (2, 6, 3), 27.954944747330675), ('TFRecord', (2, 6, 4), 32.65748333439311), ('TFRecord', (2, 6, 4), 33.74043175344617), ('TFRecord', (2, 6, 4), 37.23573003832943), ('TFRecord', (2, 6, 4), 35.91679963463542), ('TFRecord', (2, 9, 1), 34.734765649801105), ('TFRecord', (2, 9, 2), 52.74807236020245), ('TFRecord', (2, 9, 2), 37.683750372482656), ('TFRecord', (2, 9, 3), 46.6551015817536), ('TFRecord', (2, 9, 3), 33.63380778637585), ('TFRecord', (2, 9, 3), 54.717432615580854), ('TFRecord', (2, 9, 4), 59.75293274047997), ('TFRecord', (2, 9, 4), 48.278091116278), ('TFRecord', (2, 9, 4), 55.318216422366895), ('TFRecord', (2, 9, 4), 55.531507278548744), ('TFRecord', (2, 12, 1), 36.55554474185353), ('TFRecord', (2, 12, 2), 23.04517264541037), ('TFRecord', (2, 12, 2), 62.91554305536024), ('TFRecord', (2, 12, 3), 58.73837189286463), ('TFRecord', (2, 12, 3), 53.13491318221047), ('TFRecord', (2, 12, 3), 64.40839188401495), ('TFRecord', (2, 12, 4), 50.518946995987626), ('TFRecord', (2, 12, 4), 68.41783400008971), ('TFRecord', (2, 12, 4), 50.49811503621689), ('TFRecord', (2, 12, 4), 49.6882840975055), ('TFRecord', (4, 3, 1), 30.55612265031232), ('TFRecord', (4, 3, 2), 29.215925495734428), ('TFRecord', (4, 3, 2), 29.564730718940428), ('TFRecord', (4, 3, 3), 34.69537793837757), ('TFRecord', (4, 3, 3), 36.031140538323264), ('TFRecord', (4, 3, 3), 39.198766988756326), ('TFRecord', (4, 3, 4), 31.417438760471878), ('TFRecord', (4, 3, 4), 40.67236745347437), ('TFRecord', (4, 3, 4), 12.60690609402345), ('TFRecord', (4, 3, 4), 32.53094345695721), ('TFRecord', (4, 6, 1), 67.06915905783777), ('TFRecord', (4, 6, 2), 72.2948118356794), ('TFRecord', (4, 6, 2), 70.9373529380675), ('TFRecord', (4, 6, 3), 40.98029338258733), ('TFRecord', (4, 6, 3), 69.29832136405692), ('TFRecord', (4, 6, 3), 84.11613763643565), ('TFRecord', (4, 6, 4), 60.58597588316546), ('TFRecord', (4, 6, 4), 61.536375940346026), ('TFRecord', (4, 6, 4), 62.66620599237646), ('TFRecord', (4, 6, 4), 60.59560410322225), ('TFRecord', (4, 9, 1), 67.10868504350655), ('TFRecord', (4, 9, 2), 83.11957894945445), ('TFRecord', (4, 9, 2), 79.73886179789166), ('TFRecord', (4, 9, 3), 105.58452009179868), ('TFRecord', (4, 9, 3), 101.0011110494233), ('TFRecord', (4, 9, 3), 28.50175489859642), ('TFRecord', (4, 9, 4), 103.52507413260567), ('TFRecord', (4, 9, 4), 98.95182523080794), ('TFRecord', (4, 9, 4), 77.4397380705474), ('TFRecord', (4, 9, 4), 75.9280982089923), ('TFRecord', (4, 12, 1), 102.22612906108589), ('TFRecord', (4, 12, 2), 122.2463840980465), ('TFRecord', (4, 12, 2), 116.06855269006526), ('TFRecord', (4, 12, 3), 152.67872312834012), ('TFRecord', (4, 12, 3), 136.3968957375672), ('TFRecord', (4, 12, 3), 81.46078866934201), ('TFRecord', (4, 12, 4), 127.96322671351464), ('TFRecord', (4, 12, 4), 155.3902744556849), ('TFRecord', (4, 12, 4), 124.06094143223704), ('TFRecord', (4, 12, 4), 130.1621361614806), ('TFRecord', (6, 3, 1), 52.39888896754769), ('TFRecord', (6, 3, 2), 51.92012697818869), ('TFRecord', (6, 3, 2), 54.78445549684271), ('TFRecord', (6, 3, 3), 52.307910606598085), ('TFRecord', (6, 3, 3), 50.53253165751585), ('TFRecord', (6, 3, 3), 47.869739224826645), ('TFRecord', (6, 3, 4), 39.81442796616873), ('TFRecord', (6, 3, 4), 54.39957574115599), ('TFRecord', (6, 3, 4), 47.60916548112722), ('TFRecord', (6, 3, 4), 39.66528315130474), ('TFRecord', (6, 6, 1), 98.9667421286034), ('TFRecord', (6, 6, 2), 93.03160346261667), ('TFRecord', (6, 6, 2), 106.25993598856013), ('TFRecord', (6, 6, 3), 98.57746260949156), ('TFRecord', (6, 6, 3), 92.200630404756), ('TFRecord', (6, 6, 3), 100.73831246334771), ('TFRecord', (6, 6, 4), 92.16956349230573), ('TFRecord', (6, 6, 4), 87.36242503069359), ('TFRecord', (6, 6, 4), 101.64936258329973), ('TFRecord', (6, 6, 4), 99.22414894372028), ('TFRecord', (6, 9, 1), 116.88796958024201), ('TFRecord', (6, 9, 2), 153.24706283542946), ('TFRecord', (6, 9, 2), 142.094878641264), ('TFRecord', (6, 9, 3), 155.4880297668288), ('TFRecord', (6, 9, 3), 136.1255016978694), ('TFRecord', (6, 9, 3), 138.97286471627726), ('TFRecord', (6, 9, 4), 173.8019282300616), ('TFRecord', (6, 9, 4), 153.5364846085536), ('TFRecord', (6, 9, 4), 119.49161657786709), ('TFRecord', (6, 9, 4), 144.60780984936662), ('TFRecord', (6, 12, 1), 170.08771525687203), ('TFRecord', (6, 12, 2), 122.46863177275225), ('TFRecord', (6, 12, 2), 204.75792531238494), ('TFRecord', (6, 12, 3), 143.32647589685274), ('TFRecord', (6, 12, 3), 140.83358928285787), ('TFRecord', (6, 12, 3), 184.54775608080774), ('TFRecord', (6, 12, 4), 205.71167929701468), ('TFRecord', (6, 12, 4), 166.02045968316517), ('TFRecord', (6, 12, 4), 158.10757119790915), ('TFRecord', (6, 12, 4), 169.9057036779065), ('TFRecord', (8, 3, 1), 53.84247339923373), ('TFRecord', (8, 3, 2), 76.37799572370068), ('TFRecord', (8, 3, 2), 41.41286899998971), ('TFRecord', (8, 3, 3), 69.68893418052069), ('TFRecord', (8, 3, 3), 51.003207229592036), ('TFRecord', (8, 3, 3), 71.04103251012369), ('TFRecord', (8, 3, 4), 72.73370048222613), ('TFRecord', (8, 3, 4), 65.98461807720065), ('TFRecord', (8, 3, 4), 73.29186331143727), ('TFRecord', (8, 3, 4), 63.07575798399785), ('TFRecord', (8, 6, 1), 151.0297563588407), ('TFRecord', (8, 6, 2), 142.89710779818466), ('TFRecord', (8, 6, 2), 125.45565419940515), ('TFRecord', (8, 6, 3), 119.23243641480538), ('TFRecord', (8, 6, 3), 130.14034425428378), ('TFRecord', (8, 6, 3), 111.76279440027446), ('TFRecord', (8, 6, 4), 132.1357096679979), ('TFRecord', (8, 6, 4), 123.88063250154138), ('TFRecord', (8, 6, 4), 106.67128971497148), ('TFRecord', (8, 6, 4), 108.34641086011813), ('TFRecord', (8, 9, 1), 155.4259833595988), ('TFRecord', (8, 9, 2), 199.0705913451492), ('TFRecord', (8, 9, 2), 140.88740013921262), ('TFRecord', (8, 9, 3), 168.22252909316666), ('TFRecord', (8, 9, 3), 185.29931320375445), ('TFRecord', (8, 9, 3), 145.50630082652273), ('TFRecord', (8, 9, 4), 173.18982642013245), ('TFRecord', (8, 9, 4), 198.33438721160098), ('TFRecord', (8, 9, 4), 168.55020648091664), ('TFRecord', (8, 9, 4), 175.09360168002718), ('TFRecord', (8, 12, 1), 215.8247258728732), ('TFRecord', (8, 12, 2), 251.42143243832214), ('TFRecord', (8, 12, 2), 201.05235658561722), ('TFRecord', (8, 12, 3), 250.24109340789443), ('TFRecord', (8, 12, 3), 279.17397604662546), ('TFRecord', (8, 12, 3), 178.14305484276284), ('TFRecord', (8, 12, 4), 220.21136842796085), ('TFRecord', (8, 12, 4), 216.9395117188973), ('TFRecord', (8, 12, 4), 189.3003413161829), ('TFRecord', (8, 12, 4), 193.736294582692), ('Image', (2, 3, 1), 8.044638047894157), ('Image', (2, 3, 2), 8.746609648447507), ('Image', (2, 3, 2), 6.804505508589376), ('Image', (2, 3, 3), 7.727815386032658), ('Image', (2, 3, 3), 7.4928123163331115), ('Image', (2, 3, 3), 6.859725990654832), ('Image', (2, 3, 4), 6.69174266259086), ('Image', (2, 3, 4), 6.947754815369427), ('Image', (2, 3, 4), 6.907774553431732), ('Image', (2, 3, 4), 6.9748326676995305), ('Image', (2, 6, 1), 8.742588106960751), ('Image', (2, 6, 2), 9.207350126151018), ('Image', (2, 6, 2), 8.269121944279147), ('Image', (2, 6, 3), 8.890283748499936), ('Image', (2, 6, 3), 7.84418740276908), ('Image', (2, 6, 3), 8.717510971441516), ('Image', (2, 6, 4), 8.372394857358724), ('Image', (2, 6, 4), 8.825467153170761), ('Image', (2, 6, 4), 8.703344132758225), ('Image', (2, 6, 4), 9.186877195569854), ('Image', (2, 9, 1), 8.769905971843826), ('Image', (2, 9, 2), 8.751782670310467), ('Image', (2, 9, 2), 8.140406990849014), ('Image', (2, 9, 3), 8.798090692124106), ('Image', (2, 9, 3), 8.494145874907757), ('Image', (2, 9, 3), 9.054136313806964), ('Image', (2, 9, 4), 8.591246876322868), ('Image', (2, 9, 4), 8.801195323949042), ('Image', (2, 9, 4), 8.393697378510504), ('Image', (2, 9, 4), 8.628266736883681), ('Image', (2, 12, 1), 8.833991341462516), ('Image', (2, 12, 2), 9.096222064890464), ('Image', (2, 12, 2), 8.621245853420152), ('Image', (2, 12, 3), 9.303492521728618), ('Image', (2, 12, 3), 9.220051499070285), ('Image', (2, 12, 3), 9.06322214278132), ('Image', (2, 12, 4), 9.118928549202057), ('Image', (2, 12, 4), 8.784113439628737), ('Image', (2, 12, 4), 8.692920337857345), ('Image', (2, 12, 4), 9.76289776128935), ('Image', (4, 3, 1), 8.105008354342647), ('Image', (4, 3, 2), 8.908790810634478), ('Image', (4, 3, 2), 7.407092887024855), ('Image', (4, 3, 3), 8.346250777305176), ('Image', (4, 3, 3), 8.432126203335415), ('Image', (4, 3, 3), 8.700705195601284), ('Image', (4, 3, 4), 8.16456154511985), ('Image', (4, 3, 4), 8.427811369219151), ('Image', (4, 3, 4), 7.677723721742043), ('Image', (4, 3, 4), 8.086787524807454), ('Image', (4, 6, 1), 8.775227713887428), ('Image', (4, 6, 2), 9.039339505074203), ('Image', (4, 6, 2), 8.295349605893147), ('Image', (4, 6, 3), 9.2277943873453), ('Image', (4, 6, 3), 9.37877445810841), ('Image', (4, 6, 3), 9.241874880532526), ('Image', (4, 6, 4), 8.621477705097048), ('Image', (4, 6, 4), 9.23465898243922), ('Image', (4, 6, 4), 8.66165289317355), ('Image', (4, 6, 4), 9.254006437143074), ('Image', (4, 9, 1), 9.444821318638784), ('Image', (4, 9, 2), 9.426328993018977), ('Image', (4, 9, 2), 8.862174023945574), ('Image', (4, 9, 3), 9.325781708873933), ('Image', (4, 9, 3), 8.854384016820843), ('Image', (4, 9, 3), 9.888110255990137), ('Image', (4, 9, 4), 10.050417109604266), ('Image', (4, 9, 4), 9.393971145607011), ('Image', (4, 9, 4), 9.791685232042502), ('Image', (4, 9, 4), 9.61434329767099), ('Image', (4, 12, 1), 9.706739550650338), ('Image', (4, 12, 2), 9.5137262384959), ('Image', (4, 12, 2), 9.370743961136796), ('Image', (4, 12, 3), 9.885338444158972), ('Image', (4, 12, 3), 9.413372433178443), ('Image', (4, 12, 3), 9.155577186078284), ('Image', (4, 12, 4), 9.123233162165779), ('Image', (4, 12, 4), 9.356855831290984), ('Image', (4, 12, 4), 9.594878069877993), ('Image', (4, 12, 4), 9.144801962152606), ('Image', (6, 3, 1), 9.021347253678503), ('Image', (6, 3, 2), 9.723031400132495), ('Image', (6, 3, 2), 8.858889013530264), ('Image', (6, 3, 3), 9.617959561177049), ('Image', (6, 3, 3), 8.88409678129575), ('Image', (6, 3, 3), 9.152461227724375), ('Image', (6, 3, 4), 8.316904271870307), ('Image', (6, 3, 4), 8.899768162117475), ('Image', (6, 3, 4), 8.840396461146913), ('Image', (6, 3, 4), 8.672732498471595), ('Image', (6, 6, 1), 9.326390560437869), ('Image', (6, 6, 2), 9.191031517224113), ('Image', (6, 6, 2), 10.07508552099011), ('Image', (6, 6, 3), 9.378863297123704), ('Image', (6, 6, 3), 9.36956967166067), ('Image', (6, 6, 3), 9.135020916570932), ('Image', (6, 6, 4), 9.637097147872613), ('Image', (6, 6, 4), 9.341523298353621), ('Image', (6, 6, 4), 9.396501845260943), ('Image', (6, 6, 4), 8.971439564993007), ('Image', (6, 9, 1), 8.965694560186487), ('Image', (6, 9, 2), 9.388413538769477), ('Image', (6, 9, 2), 9.567961691048747), ('Image', (6, 9, 3), 9.561951934574301), ('Image', (6, 9, 3), 9.370734171751822), ('Image', (6, 9, 3), 8.920544003622217), ('Image', (6, 9, 4), 9.213755046988062), ('Image', (6, 9, 4), 9.678491373077355), ('Image', (6, 9, 4), 9.509847955742499), ('Image', (6, 9, 4), 9.393362009276307), ('Image', (6, 12, 1), 9.371590481049916), ('Image', (6, 12, 2), 9.536303745107665), ('Image', (6, 12, 2), 4.591303211926343), ('Image', (6, 12, 3), 8.693651070242995), ('Image', (6, 12, 3), 9.37896757588553), ('Image', (6, 12, 3), 9.31929779517164), ('Image', (6, 12, 4), 6.376937384254447), ('Image', (6, 12, 4), 9.623751244596656), ('Image', (6, 12, 4), 9.714835517019466), ('Image', (6, 12, 4), 9.482909403781358), ('Image', (8, 3, 1), 8.565009364109294), ('Image', (8, 3, 2), 9.728915252769548), ('Image', (8, 3, 2), 8.900280686528161), ('Image', (8, 3, 3), 9.101167200489092), ('Image', (8, 3, 3), 8.795373501925901), ('Image', (8, 3, 3), 9.116491470210264), ('Image', (8, 3, 4), 9.384372855233869), ('Image', (8, 3, 4), 9.038975872489424), ('Image', (8, 3, 4), 9.098991270732045), ('Image', (8, 3, 4), 9.178606031859097), ('Image', (8, 6, 1), 9.486050797806726), ('Image', (8, 6, 2), 9.461299373775727), ('Image', (8, 6, 2), 9.635942170158312), ('Image', (8, 6, 3), 9.382722281725794), ('Image', (8, 6, 3), 9.065292826567697), ('Image', (8, 6, 3), 8.624963628281552), ('Image', (8, 6, 4), 9.751051768485102), ('Image', (8, 6, 4), 9.709312358973142), ('Image', (8, 6, 4), 8.985109984106534), ('Image', (8, 6, 4), 9.185578657451094), ('Image', (8, 9, 1), 9.764524108528107), ('Image', (8, 9, 2), 9.542455775714194), ('Image', (8, 9, 2), 9.405045197115482), ('Image', (8, 9, 3), 9.511199560530072), ('Image', (8, 9, 3), 9.262701905291161), ('Image', (8, 9, 3), 9.371005665148791), ('Image', (8, 9, 4), 9.428171846236479), ('Image', (8, 9, 4), 9.372814148531862), ('Image', (8, 9, 4), 9.219101261999848), ('Image', (8, 9, 4), 9.186320235077897), ('Image', (8, 12, 1), 9.45645137191322), ('Image', (8, 12, 2), 9.426943834963273), ('Image', (8, 12, 2), 9.466560512249606), ('Image', (8, 12, 3), 9.400515746060377), ('Image', (8, 12, 3), 9.232640829219187), ('Image', (8, 12, 3), 9.450228120342546), ('Image', (8, 12, 4), 9.37296454759189), ('Image', (8, 12, 4), 9.59558301159847), ('Image', (8, 12, 4), 9.544448011353596), ('Image', (8, 12, 4), 9.257551270713881)], '2a iv results': [(((6, 3, 2), 46.8914999944101), ['TFRecord']), (((6, 3, 3), 31.98426067494557), ['TFRecord']), (((6, 3, 4), 52.627688807284194), ['TFRecord']), (((6, 6, 2), 81.62524218101301), ['TFRecord']), (((6, 6, 3), 88.4779893377523), ['TFRecord']), (((6, 6, 4), 79.41814739134207), ['TFRecord']), (((6, 6, 4), 91.86591021783902), ['TFRecord']), (((6, 9, 2), 152.9828025361548), ['TFRecord']), (((6, 9, 4), 98.97396438740712), ['TFRecord']), (((6, 9, 4), 118.33768698241856), ['TFRecord']), (((6, 12, 2), 187.74674478519063), ['TFRecord']), (((6, 12, 4), 165.88202646511144), ['TFRecord']), (((6, 12, 4), 137.68362253181306), ['TFRecord']), (((6, 12, 4), 193.63427672290584), ['TFRecord']), (((8, 3, 1), 63.476765779917), ['TFRecord']), (((8, 3, 4), 58.0738504886732), ['TFRecord']), (((8, 6, 1), 124.85416503875364), ['TFRecord']), (((8, 6, 2), 143.302943550511), ['TFRecord']), (((8, 6, 2), 107.26948738031682), ['TFRecord']), (((8, 6, 3), 106.5485025376681), ['TFRecord']), (((8, 6, 4), 145.17620895690285), ['TFRecord']), (((8, 6, 4), 121.66968957477437), ['TFRecord']), (((8, 12, 3), 212.5282101059492), ['TFRecord']), (((8, 12, 4), 263.9024908816233), ['TFRecord']), (((8, 12, 4), 219.47976321555888), ['TFRecord']), (((6, 3, 2), 6.545862585865302), ['Image']), (((6, 3, 3), 7.412592010038262), ['Image']), (((6, 3, 3), 7.450943957649588), ['Image']), (((6, 3, 3), 7.60272144246682), ['Image']), (((6, 6, 3), 8.789326071283007), ['Image']), (((6, 9, 3), 9.127579544381108), ['Image']), (((6, 9, 3), 9.531770940297553), ['Image']), (((6, 9, 3), 9.298797360432593), ['Image']), (((6, 12, 4), 9.25297887722372), ['Image']), (((6, 12, 4), 9.16825835389885), ['Image']), (((6, 12, 4), 9.365965491092156), ['Image']), (((6, 12, 4), 9.261862159125224), ['Image']), (((8, 3, 3), 9.254740669805784), ['Image']), (((8, 3, 3), 9.093307505066376), ['Image']), (((8, 6, 1), 8.737988837944998), ['Image']), (((8, 6, 4), 9.10950376277334), ['Image']), (((8, 6, 4), 9.412351422655206), ['Image']), (((8, 6, 4), 9.109187630678424), ['Image']), (((8, 9, 1), 9.393093406617675), ['Image']), (((8, 12, 2), 9.16940812684376), ['Image']), (((8, 12, 2), 9.338650295650076), ['Image']), (((8, 12, 3), 8.520762000863519), ['Image']), (((2, 3, 2), 6.564296041753451), ['Image']), (((2, 3, 3), 7.701012803796003), ['Image']), (((2, 3, 3), 7.4975715992408825), ['Image']), (((2, 3, 4), 8.112914925018037), ['Image']), (((2, 6, 2), 9.245648827477764), ['Image']), (((2, 9, 2), 8.717594519209142), ['Image']), (((2, 9, 2), 8.787438593534416), ['Image']), (((2, 9, 3), 9.089514610890735), ['Image']), (((2, 9, 3), 9.1899490969325), ['Image']), (((2, 12, 4), 9.22263552414298), ['Image']), (((2, 12, 4), 9.156409567907298), ['Image']), (((2, 12, 4), 9.22729448102843), ['Image']), (((2, 12, 4), 9.310994707447229), ['Image']), (((4, 3, 2), 8.871851856030053), ['Image']), (((4, 3, 2), 8.380590568356272), ['Image']), (((4, 3, 3), 9.652314792086013), ['Image']), (((4, 6, 4), 9.227549079676994), ['Image']), (((4, 6, 4), 9.108350625452474), ['Image']), (((4, 6, 4), 9.238377013658878), ['Image']), (((4, 9, 1), 9.545643993464745), ['Image']), (((4, 12, 2), 9.429668554162333), ['Image']), (((4, 12, 2), 9.466599238399128), ['Image']), (((2, 3, 1), 13.522226717841502), ['TFRecord']), (((2, 3, 3), 15.862909615577353), ['TFRecord']), (((2, 6, 1), 22.83766144196075), ['TFRecord']), (((2, 6, 4), 39.11560135256435), ['TFRecord']), (((2, 12, 2), 67.0620546858293), ['TFRecord']), (((2, 12, 4), 57.913044678917025), ['TFRecord']), (((4, 3, 1), 35.3476662385008), ['TFRecord']), (((4, 3, 3), 33.7898571983869), ['TFRecord']), (((4, 3, 4), 38.86601740226285), ['TFRecord']), (((4, 3, 4), 34.155523675999355), ['TFRecord']), (((4, 6, 3), 70.00584591568278), ['TFRecord']), (((4, 6, 4), 65.3661586333946), ['TFRecord']), (((4, 6, 4), 69.2264075036603), ['TFRecord']), (((4, 6, 4), 69.61678549174495), ['TFRecord']), (((4, 9, 2), 94.45129715373058), ['TFRecord']), (((4, 9, 3), 83.1331705850679), ['TFRecord']), (((4, 12, 1), 138.58032914848025), ['TFRecord']), (((4, 12, 4), 115.7250235385682), ['TFRecord']), (((4, 12, 4), 115.43274221763279), ['TFRecord']), (((4, 12, 4), 123.29509750845743), ['TFRecord']), (((2, 3, 2), 9.185519146426214), ['Image']), (((2, 3, 3), 8.277621648931131), ['Image']), (((2, 3, 4), 7.410948290560913), ['Image']), (((2, 3, 4), 7.657332724783204), ['Image']), (((2, 6, 3), 7.814548651231019), ['Image']), (((2, 6, 4), 8.720380697212585), ['Image']), (((2, 6, 4), 8.876575549388775), ['Image']), (((2, 6, 4), 8.120121592943711), ['Image']), (((2, 6, 4), 8.554546236377846), ['Image']), (((2, 9, 1), 8.762421670902366), ['Image']), (((2, 9, 4), 9.046319666183221), ['Image']), (((2, 12, 2), 8.999866159760543), ['Image']), (((2, 12, 3), 9.36112689175103), ['Image']), (((2, 12, 3), 9.434503716459801), ['Image']), (((4, 3, 1), 8.336365387510702), ['Image']), (((4, 3, 4), 9.480684937751255), ['Image']), (((4, 6, 3), 9.347322348190378), ['Image']), (((4, 6, 3), 9.480832270392847), ['Image']), (((4, 6, 3), 9.776238303205163), ['Image']), (((4, 9, 2), 9.316602130068686), ['Image']), (((4, 9, 2), 9.037513520812356), ['Image']), (((4, 12, 1), 9.783875474568273), ['Image']), (((2, 3, 3), 16.18114574063691), ['TFRecord']), (((2, 3, 4), 19.738861026967587), ['TFRecord']), (((2, 3, 4), 15.241927160933491), ['TFRecord']), (((2, 3, 4), 15.63913527393536), ['TFRecord']), (((2, 6, 4), 32.22605262669264), ['TFRecord']), (((2, 6, 4), 36.63822232186858), ['TFRecord']), (((2, 9, 1), 44.338839951395954), ['TFRecord']), (((2, 9, 2), 55.59403069482347), ['TFRecord']), (((2, 9, 3), 42.9691920496934), ['TFRecord']), (((2, 9, 3), 46.369070855541075), ['TFRecord']), (((2, 9, 3), 46.13127261195457), ['TFRecord']), (((2, 9, 4), 49.805896951777044), ['TFRecord']), (((2, 12, 2), 64.78685975513609), ['TFRecord']), (((2, 12, 4), 66.20590374742348), ['TFRecord']), (((4, 3, 3), 30.62061010465299), ['TFRecord']), (((4, 3, 4), 21.041078298006827), ['TFRecord']), (((4, 6, 4), 74.9646048475921), ['TFRecord']), (((4, 9, 1), 82.21322359587636), ['TFRecord']), (((4, 9, 2), 85.63838406868541), ['TFRecord']), (((4, 9, 4), 103.53593502936816), ['TFRecord']), (((4, 12, 2), 126.01010200901044), ['TFRecord']), (((4, 12, 3), 107.48195096950542), ['TFRecord']), (((6, 3, 1), 42.07869704385862), ['TFRecord']), (((6, 3, 4), 47.3174922017535), ['TFRecord']), (((6, 3, 4), 39.466020970488884), ['TFRecord']), (((6, 6, 3), 71.7483004349233), ['TFRecord']), (((6, 6, 4), 60.58496704227929), ['TFRecord']), (((6, 9, 3), 150.6599766519106), ['TFRecord']), (((6, 9, 3), 130.0695312401296), ['TFRecord']), (((6, 12, 3), 153.7679960405961), ['TFRecord']), (((8, 3, 2), 55.23460274748308), ['TFRecord']), (((8, 3, 2), 59.06988573115221), ['TFRecord']), (((8, 3, 3), 50.51942871653938), ['TFRecord']), (((8, 3, 3), 62.481485205668214), ['TFRecord']), (((8, 6, 3), 109.21789700045787), ['TFRecord']), (((8, 6, 3), 129.8327564825581), ['TFRecord']), (((8, 9, 1), 150.3897755432141), ['TFRecord']), (((8, 9, 3), 144.68432034181137), ['TFRecord']), (((8, 9, 4), 179.43429246748832), ['TFRecord']), (((8, 12, 1), 233.26338132772247), ['TFRecord']), (((8, 12, 3), 135.4843713881074), ['TFRecord']), (((8, 12, 4), 232.6552499991333), ['TFRecord']), (((8, 12, 4), 248.8619647485936), ['TFRecord']), (((6, 3, 4), 7.431658883506962), ['Image']), (((6, 3, 4), 7.265836806535661), ['Image']), (((6, 3, 4), 7.325363976049624), ['Image']), (((6, 3, 4), 7.5215728922601715), ['Image']), (((6, 9, 4), 9.573126383447615), ['Image']), (((6, 9, 4), 9.240725407770352), ['Image']), (((6, 9, 4), 9.601459368951462), ['Image']), (((6, 9, 4), 9.609581901305653), ['Image']), (((6, 12, 3), 9.353537071755492), ['Image']), (((6, 12, 3), 9.453483578217018), ['Image']), (((6, 12, 3), 9.38605522405233), ['Image']), (((8, 3, 4), 9.00310277582704), ['Image']), (((8, 3, 4), 9.139452068475553), ['Image']), (((8, 6, 3), 9.269782731731915), ['Image']), (((8, 6, 3), 9.315597692257933), ['Image']), (((8, 9, 2), 9.18845119057562), ['Image']), (((8, 9, 2), 9.436423778109376), ['Image']), (((8, 12, 1), 9.597169795198516), ['Image']), (((8, 12, 4), 8.346775526083679), ['Image']), (((6, 3, 1), 7.112545433494013), ['Image']), (((6, 6, 4), 9.34662744748242), ['Image']), (((6, 6, 4), 9.33507115726239), ['Image']), (((6, 6, 4), 9.333824148202847), ['Image']), (((6, 6, 4), 9.136901447109759), ['Image']), (((6, 9, 1), 9.641095992221823), ['Image']), (((6, 12, 2), 9.37145408533516), ['Image']), (((6, 12, 2), 9.617591992799941), ['Image']), (((8, 3, 1), 9.69551586960276), ['Image']), (((8, 3, 4), 8.72925480221202), ['Image']), (((8, 3, 4), 8.84913700004035), ['Image']), (((8, 6, 2), 9.90595223334219), ['Image']), (((8, 6, 2), 9.640183366257897), ['Image']), (((8, 6, 3), 8.809518729503509), ['Image']), (((8, 9, 3), 9.624906062392705), ['Image']), (((8, 9, 3), 9.254801081156321), ['Image']), (((8, 9, 3), 9.344547702403569), ['Image']), (((8, 12, 4), 9.538140522881159), ['Image']), (((8, 12, 4), 9.41986278574664), ['Image']), (((8, 12, 4), 9.754493087725061), ['Image']), (((2, 3, 1), 7.191381940320771), ['Image']), (((2, 6, 1), 8.580097178820724), ['Image']), (((2, 9, 4), 8.962045475534934), ['Image']), (((2, 9, 4), 8.359049472282734), ['Image']), (((2, 9, 4), 8.768175497599007), ['Image']), (((2, 12, 2), 9.029949638105176), ['Image']), (((2, 12, 3), 8.91472221799103), ['Image']), (((4, 3, 4), 8.462573715128125), ['Image']), (((4, 3, 4), 8.841786393440463), ['Image']), (((4, 3, 4), 8.929979049922501), ['Image']), (((4, 6, 2), 9.260168073998702), ['Image']), (((4, 6, 2), 9.086215851307944), ['Image']), (((4, 9, 3), 9.049983292931696), ['Image']), (((4, 9, 3), 9.444107711465968), ['Image']), (((4, 9, 3), 9.292213276851195), ['Image']), (((4, 12, 3), 10.07855185984043), ['Image']), (((4, 12, 4), 9.223321264579845), ['Image']), (((4, 12, 4), 9.182086833189995), ['Image']), (((4, 12, 4), 9.750204567432865), ['Image']), (((6, 3, 3), 45.26189348530648), ['TFRecord']), (((6, 3, 4), 50.29660802973928), ['TFRecord']), (((6, 9, 1), 137.6558197541804), ['TFRecord']), (((6, 12, 3), 176.35414031485524), ['TFRecord']), (((8, 3, 4), 68.53041320457353), ['TFRecord']), (((8, 6, 4), 99.53368817292547), ['TFRecord']), (((8, 6, 4), 111.95539725570339), ['TFRecord']), (((8, 9, 2), 180.7428708914034), ['TFRecord']), (((8, 9, 3), 165.2904162283405), ['TFRecord']), (((8, 9, 3), 177.4444603745026), ['TFRecord']), (((8, 9, 4), 138.59759685749256), ['TFRecord']), (((8, 9, 4), 170.52894995259476), ['TFRecord']), (((8, 9, 4), 178.6672914314924), ['TFRecord']), (((8, 12, 2), 223.3707125671868), ['TFRecord']), (((8, 12, 3), 230.1041012095728), ['TFRecord']), (((2, 3, 2), 8.991724954051342), ['TFRecord']), (((2, 3, 2), 16.113913603052996), ['TFRecord']), (((2, 3, 3), 17.28178656164482), ['TFRecord']), (((2, 6, 2), 31.799763452382155), ['TFRecord']), (((2, 6, 3), 30.30595670478521), ['TFRecord']), (((2, 6, 3), 30.480365243710793), ['TFRecord']), (((2, 6, 3), 34.57629996929247), ['TFRecord']), (((2, 9, 4), 44.76500077970791), ['TFRecord']), (((2, 9, 4), 48.708172150121676), ['TFRecord']), (((2, 12, 3), 64.05999270709836), ['TFRecord']), (((2, 12, 4), 59.258775056557724), ['TFRecord']), (((4, 3, 3), 39.99628737261683), ['TFRecord']), (((4, 3, 4), 36.86033736393869), ['TFRecord']), (((4, 6, 2), 61.91528598131531), ['TFRecord']), (((4, 9, 3), 89.23265268011268), ['TFRecord']), (((4, 9, 3), 97.1062925055227), ['TFRecord']), (((4, 9, 4), 106.739400811388), ['TFRecord']), (((4, 9, 4), 66.67305925225648), ['TFRecord']), (((4, 12, 4), 141.2584245696853), ['TFRecord']), (((2, 3, 4), 17.300308116201467), ['TFRecord']), (((2, 6, 2), 28.168943203912292), ['TFRecord']), (((2, 6, 4), 30.98497219569943), ['TFRecord']), (((2, 9, 2), 53.28032316480191), ['TFRecord']), (((2, 9, 4), 39.89852856698183), ['TFRecord']), (((2, 12, 1), 53.765603318339), ['TFRecord']), (((2, 12, 3), 71.96949153996513), ['TFRecord']), (((2, 12, 3), 63.58317684400019), ['TFRecord']), (((2, 12, 4), 56.63813434490178), ['TFRecord']), (((4, 3, 2), 29.988285111152024), ['TFRecord']), (((4, 3, 2), 33.86572575110415), ['TFRecord']), (((4, 6, 1), 53.82594779171655), ['TFRecord']), (((4, 6, 2), 50.095348242340876), ['TFRecord']), (((4, 6, 3), 55.51178580409492), ['TFRecord']), (((4, 6, 3), 51.087798505682606), ['TFRecord']), (((4, 9, 4), 89.4838411069344), ['TFRecord']), (((4, 12, 2), 136.9230536949039), ['TFRecord']), (((4, 12, 3), 117.1758995248979), ['TFRecord']), (((4, 12, 3), 141.75493225107797), ['TFRecord']), (((6, 3, 2), 7.106913300191103), ['Image']), (((6, 6, 1), 7.383349393063468), ['Image']), (((6, 6, 2), 8.719304580415614), ['Image']), (((6, 6, 2), 8.751471223735434), ['Image']), (((6, 6, 3), 9.263715712444391), ['Image']), (((6, 6, 3), 9.117896354790556), ['Image']), (((6, 9, 2), 9.27716526866915), ['Image']), (((6, 9, 2), 9.410911088967376), ['Image']), (((6, 12, 1), 9.12100796432612), ['Image']), (((8, 3, 2), 9.262622071721044), ['Image']), (((8, 3, 2), 9.316746993906458), ['Image']), (((8, 3, 3), 8.62284248614467), ['Image']), (((8, 6, 4), 8.760942965482963), ['Image']), (((8, 9, 4), 9.116119402462436), ['Image']), (((8, 9, 4), 9.119029055407264), ['Image']), (((8, 9, 4), 9.527070120258996), ['Image']), (((8, 9, 4), 9.115945487718509), ['Image']), (((8, 12, 3), 9.500825278125523), ['Image']), (((8, 12, 3), 9.538154305341703), ['Image']), (((2, 3, 4), 9.081522080385348), ['Image']), (((2, 6, 2), 8.449324848360318), ['Image']), (((2, 6, 3), 9.039592766479206), ['Image']), (((2, 6, 3), 9.092865595117871), ['Image']), (((2, 9, 3), 8.69813499980587), ['Image']), (((2, 12, 1), 9.68292638350405), ['Image']), (((4, 3, 3), 8.767370077160086), ['Image']), (((4, 3, 3), 8.943406244080718), ['Image']), (((4, 6, 1), 9.069857873871834), ['Image']), (((4, 6, 4), 8.866809051248143), ['Image']), (((4, 9, 4), 9.405208056085819), ['Image']), (((4, 9, 4), 9.626070362427948), ['Image']), (((4, 9, 4), 9.860050764636625), ['Image']), (((4, 9, 4), 9.2419619934539), ['Image']), (((4, 12, 3), 9.731773136071421), ['Image']), (((4, 12, 3), 9.514940690002494), ['Image']), (((4, 12, 4), 10.184297886928555), ['Image']), (((6, 3, 2), 43.35481736961248), ['TFRecord']), (((6, 3, 3), 50.42961593388757), ['TFRecord']), (((6, 6, 1), 91.16323595646719), ['TFRecord']), (((6, 6, 2), 80.13330382630764), ['TFRecord']), (((6, 6, 3), 97.85194440268137), ['TFRecord']), (((6, 6, 4), 94.75910863209077), ['TFRecord']), (((6, 9, 2), 125.07975330022796), ['TFRecord']), (((6, 9, 3), 112.58785054394428), ['TFRecord']), (((6, 9, 4), 151.60165381858195), ['TFRecord']), (((6, 9, 4), 139.65935295782515), ['TFRecord']), (((6, 12, 1), 153.01962314362487), ['TFRecord']), (((6, 12, 2), 158.59264168521352), ['TFRecord']), (((6, 12, 3), 139.0159404144839), ['TFRecord']), (((6, 12, 4), 172.77989735843875), ['TFRecord']), (((8, 3, 3), 48.045797132715364), ['TFRecord']), (((8, 3, 4), 59.224468447500165), ['TFRecord']), (((8, 3, 4), 67.25458226156672), ['TFRecord']), (((8, 9, 2), 183.31080598754417), ['TFRecord']), (((8, 12, 2), 228.42188135544183), ['TFRecord'])], '2a v results': [((2, 3, 2), 3.0), ((2, 3, 4), 1.5), ((2, 6, 1), 12.0), ((2, 6, 3), 4.0), ((2, 9, 2), 9.0), ((2, 9, 4), 4.5), ((2, 12, 1), 24.0), ((2, 12, 3), 8.0), ((4, 3, 2), 6.0), ((4, 3, 4), 3.0), ((4, 6, 1), 24.0), ((4, 6, 3), 8.0), ((4, 9, 2), 18.0), ((4, 9, 4), 9.0), ((4, 12, 1), 48.0), ((4, 12, 3), 16.0), ((6, 3, 2), 9.0), ((6, 3, 4), 4.5), ((6, 6, 1), 36.0), ((6, 6, 3), 12.0), ((6, 9, 2), 27.0), ((6, 9, 4), 13.5), ((6, 12, 1), 72.0), ((6, 12, 3), 24.0), ((8, 3, 2), 12.0), ((8, 3, 4), 6.0), ((8, 6, 1), 48.0), ((8, 6, 3), 16.0), ((8, 9, 2), 36.0), ((8, 9, 4), 18.0), ((8, 12, 1), 96.0), ((8, 12, 3), 32.0), ((2, 3, 1), 6.0), ((2, 3, 3), 2.0), ((2, 6, 2), 6.0), ((2, 6, 4), 3.0), ((2, 9, 1), 18.0), ((2, 9, 3), 6.0), ((2, 12, 2), 12.0), ((2, 12, 4), 6.0), ((4, 3, 1), 12.0), ((4, 3, 3), 4.0), ((4, 6, 2), 12.0), ((4, 6, 4), 6.0), ((4, 9, 1), 36.0), ((4, 9, 3), 12.0), ((4, 12, 2), 24.0), ((4, 12, 4), 12.0), ((6, 3, 1), 18.0), ((6, 3, 3), 6.0), ((6, 6, 2), 18.0), ((6, 6, 4), 9.0), ((6, 9, 1), 54.0), ((6, 9, 3), 18.0), ((6, 12, 2), 36.0), ((6, 12, 4), 18.0), ((8, 3, 1), 24.0), ((8, 3, 3), 8.0), ((8, 6, 2), 24.0), ((8, 6, 4), 12.0), ((8, 9, 1), 72.0), ((8, 9, 3), 24.0), ((8, 12, 2), 48.0), ((8, 12, 4), 24.0)]}
import pandas as pd
results_2a_iii = results_task2c.get('2a iii results', [])
results_2a_iv = results_task2c.get('2a iv results', [])
results_2a_v = results_task2c.get('2a v results', [])
df_2a_iii = pd.DataFrame(results_2a_iii, columns=['Result Type', 'Parameters', 'Images per Second'])
df_2a_iv = pd.DataFrame(results_2a_iv, columns=['Parameter Combination', 'Results'])
df_2a_v = pd.DataFrame(results_2a_v, columns=['Parameter Combination', 'Average Images per Second'])
print("Results from 2a iii:")
print(df_2a_iii)
print("\nResults from 2a iv:")
print(df_2a_iv)
print("\nResults from 2a v:")
print(df_2a_v)
#we exctract the results of the deserialized dictionary
#we transform the results into a structured pandas dataframe
Results from 2a iii:
Result Type Parameters Images per Second
0 TFRecord (2, 3, 1) 16.005139
1 TFRecord (2, 3, 2) 14.250337
2 TFRecord (2, 3, 2) 20.207751
3 TFRecord (2, 3, 3) 17.138180
4 TFRecord (2, 3, 3) 17.675149
.. ... ... ...
315 Image (8, 12, 3) 9.450228
316 Image (8, 12, 4) 9.372965
317 Image (8, 12, 4) 9.595583
318 Image (8, 12, 4) 9.544448
319 Image (8, 12, 4) 9.257551
[320 rows x 3 columns]
Results from 2a iv:
Parameter Combination Results
0 ((6, 3, 2), 46.8914999944101) [TFRecord]
1 ((6, 3, 3), 31.98426067494557) [TFRecord]
2 ((6, 3, 4), 52.627688807284194) [TFRecord]
3 ((6, 6, 2), 81.62524218101301) [TFRecord]
4 ((6, 6, 3), 88.4779893377523) [TFRecord]
.. ... ...
315 ((8, 3, 3), 48.045797132715364) [TFRecord]
316 ((8, 3, 4), 59.224468447500165) [TFRecord]
317 ((8, 3, 4), 67.25458226156672) [TFRecord]
318 ((8, 9, 2), 183.31080598754417) [TFRecord]
319 ((8, 12, 2), 228.42188135544183) [TFRecord]
[320 rows x 2 columns]
Results from 2a v:
Parameter Combination Average Images per Second
0 (2, 3, 2) 3.0
1 (2, 3, 4) 1.5
2 (2, 6, 1) 12.0
3 (2, 6, 3) 4.0
4 (2, 9, 2) 9.0
.. ... ...
59 (8, 6, 4) 12.0
60 (8, 9, 1) 72.0
61 (8, 9, 3) 24.0
62 (8, 12, 2) 48.0
63 (8, 12, 4) 24.0
[64 rows x 2 columns]
import pandas as pd
results_2a_iii = results_task2c.get('2a iii results', [])
data = {
'Dataset': [result[0] for result in results_2a_iii],
'Batch Size': [params[0] for _, params, _ in results_2a_iii],
'Batch Number': [params[1] for _, params, _ in results_2a_iii],
'Repetitions': [params[2] for _, params, _ in results_2a_iii],
'Images per Second': [ips for _, _, ips in results_2a_iii]
}
dataframe = pd.DataFrame(data)
dataframe['Dataset Volume (per Batch Setup)'] = dataframe['Batch Size'] * dataframe['Batch Number']
print(dataframe)
#we construct a dictionary were each key corresponds to a column in the dataframe
#we include dataset batch size batch number repetitions and images per second
#we convert the dictionary to a dataframe
#we add a new column called dataset volume per batch which is calculated by
#multiplying batch size and batch number
Dataset Batch Size Batch Number Repetitions Images per Second \
0 TFRecord 2 3 1 16.005139
1 TFRecord 2 3 2 14.250337
2 TFRecord 2 3 2 20.207751
3 TFRecord 2 3 3 17.138180
4 TFRecord 2 3 3 17.675149
.. ... ... ... ... ...
315 Image 8 12 3 9.450228
316 Image 8 12 4 9.372965
317 Image 8 12 4 9.595583
318 Image 8 12 4 9.544448
319 Image 8 12 4 9.257551
Dataset Volume (per Batch Setup)
0 6
1 6
2 6
3 6
4 6
.. ...
315 96
316 96
317 96
318 96
319 96
[320 rows x 6 columns]
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
if 'Dataset Volume (per Batch Setup)' not in dataframe.columns:
dataframe['Dataset Volume (per Batch Setup)'] = dataframe['Batch Size'] * dataframe['Batch Number']
def regression_by_parameter(dataset, parameter, title):
filtered_data = dataframe[dataframe['Dataset'] == dataset]
X = filtered_data[[parameter]]
y = filtered_data['Images per Second']
linear_model = LinearRegression()
linear_model.fit(X, y)
model_predictions = linear_model.predict(X)
plt.figure(figsize=(8, 4))
plt.scatter(X[parameter], y, color='blue', label='Actual Values')
plt.plot(X[parameter], model_predictions, color='red', label='Regression Line')
plt.title(f'{title} ({dataset})')
plt.xlabel(parameter)
plt.ylabel('Images per Second')
plt.legend()
plt.grid(True)
plt.show()
parameters = ['Batch Number', 'Batch Size', 'Repetitions', 'Dataset Volume (per Batch Setup)']
titles = ['Batch Number vs. Images per Second', 'Batch Size vs. Images per Second',
'Repetitions vs. Images per Second', 'Dataset Volume (per Batch Setup) vs. Images per Second']
for dataset_type in ['TFRecord', 'Image']:
for parameter, title in zip(parameters, titles):
regression_by_parameter(dataset_type, parameter, title)
#we import libraries
#we ensure the dataset volumn column exists
#if it doesnt exist we compute it through multiplication of batch size and number
#e define a function to perform and plot a linear regression
#we filter the dataset to include only relevant entries
#we fit a linear regression model
#parameters is the indepentend variable and image per second the dependent variable
#we plot the actual values as a scatter plot as well as the regression line
#we loop through each type of dataset (tfrecord and image) as well as each parameter
#we plot a linear regression for each combination
#we use lists of parameters and titles to manage the analysis
In this task we refer an idea that is introduced in this paper:
Alipourfard et al (2017) introduce the prediction an optimal or near-optimal cloud configuration for a given compute task.
Relate the previous tasks and the results to this concept. (It is not necessary to work through the full details of the paper, focus just on the main ideas). To what extent and under what conditions do the concepts and techniques in the paper apply to the task in this coursework? (12%)
Define - as far as possible - concrete strategies for different application scenarios (batch, stream) and discuss the general relationship with the concepts above. (12%)
Provide the answers to these questions in your report.
Once you have finshed the work, you can delete the buckets, to stop incurring cost that depletes your credit.
!gsutil -m rm -r $BUCKET/* # Empty your bucket
!gsutil rb $BUCKET # delete the bucket